Projet Raw-data ● La Saga le développement de cet été ● Le Résultat Readers Analyst & Xcalibur 15/12/2008
La Saga ● La source : Les API des constructeurs ● L'interface : OLE/COM ● Le software : Développement d'un reader 15/12/2008
La Saga ● Non trivial ! ● Situation pré-existante inacceptable ● Pas de point commun entre les API 15/12/2008
Fonctionnement API Analyst API Xcalibur ● Automation ● Structure d'export de Control de données l'application 15/12/2008
Documentations des API DOC Analyst : DOC Xcalibur : ● Analyst Automation ● XDK Cookbook ● Très succin ● Très fourni ● Abondance ● Fragments de code d'exemples : en VB.Net – * VB6 ; VBScript ; VBA / Excel ● FAQ 15/12/2008
Support technique des API Analyst : Xcalibur : ● Fraction de tout Analyste (OleView) ● Pièces manquantes ● Service E-mails lent 15/12/2008
Interface : OLE / COM ● Contrairement à Linux, dans Windows, pas de standards Orientés Objet ● Common Object Model – un système minimal pour pouvoir échanger des objets ● Auto-importation dans les outils microsoft : * VB6 ; VB.Net ; MSVC ; ActiveX ● Outils tiers ● XYDispDriver ● DispHelper ● Reverse Engineering : OleView 15/12/2008
Software Development Nombreuses itérations ● Maquette Analyst Visual Basic.NET - I export CSV ; tests graph R ● Maquette Analyst VB.Net - II export pseudo mzXML ; tests SmileMS test contrôles directs d'analyste ● Projet « BolWiff » : Analyste C++ - I ● Captain-Bol – Boost serialisation – Google ProtoBuf serialisation ● Autoconf : XYDispDriver ; MSVC + wrapper – beaucoup de problèmes ● MSCV (portage des autres libraries) ● En production pour SmileMS ● Maquette Xcalibur VB.Net ● Projet « XenoBol » : « Merlinbol » - Xcalibur C++ ● DispHelper : Autoconf (Windows + Linux) + MSVC ● Contournement de limite de mémoire ● Projet « XenoBol » : « Freudbol » - Analyst C++ - II 15/12/2008
Résultats ● Programmes - ce qui a été fait ● Extérieur - comment cela s'articule avec l'écosystème ● Intérieur - architecture et technologie des readers 15/12/2008
Programmes ● Deux executables – projet Xenobol ● merlinbol reader pour Xcalibur de Thermo ● freudbol reader pour Analyst de Applied ● Simple convertisseurs en ligne de commande ● Ensemble des sources (LGPLv3) : http://code.google.com/p/captain-bol/ - module xenobol - module bolwiff (SmileMS) 15/12/2008
Programmes ● Demo : 15/12/2008
Partiel ● Problème : mémoire dans un système 32bits limitée (Windows XP licence normale 2Go) → problématique avec quantitative → impossible de charger en un bloc ● Stratégie de chargement en plusieurs partie 15/12/2008
Paramètres ● En plus de input / output, paramètres pour le chargement partiel : ● Skip-peak – ne charge que la structure gobale – pas des pics / pas de contenus des spectres ● Skip-all – ignore complètement la collection ● Refid – chaque spectre a un « refid » : un champs 64bits – readers y mettent un identifiant opaque unique pour le spectre – Avec le paramètre « refid » : on peut lire un spectre spécifique 15/12/2008
Statégie pour le partiel ● Stratégie possible : ● Conversion complète de MS2 uniquement ; contenus spectres MS1 ignorés – liste seule ● Détection et matching des peptides avec MS2 ● Détection des peptides intéressant ● Recherche des spectres MS1 contenant les parents – Pas de détails dans les spectres mais – « refid » : identifiand unique pour chaque spectre ● Conversion complète des MS1 sélectionnés 15/12/2008
Intérieur - versatile ● Acces COM / OLE « DispHelper » ● Licence BSD, URL: disphelper.sf.net ● Légèrement modifié ● Fonctionne sur Windows (MSVC, MingW32) sur Linux (cross-compile ou natif Wine-GCC) ● Logique est stockée dans une classe séparée ● Merlinbol → classe Arthur ● Freudbol → classe Analyst 15/12/2008
Intérieur - versatile ● Tout le reader /*************** * * * GET DATA * = Un court passage qui * * ***************/ appelle les méthode de la bol::RunLcmsms *run; { classe arthur reader; // init the reader, and open the file reader.initfile(ifname.c_str()); ● On pourrait tout aussi bien // get information about sample if (vm.count("sample-info")) { imaginer appeler les reader.samplelist(NULL); dhUninitialize(TRUE); exit(0); méthodes depuis un autre } else { if (vm.count("runname")) reader.samplelist(&runname); programme. else reader.samplelist(); } // read the file reader.dosample( allatonce, skipms1,skipms2,dropms1,dropms2, reflist.size() ? &reflist : NULL); // create links between fragment and precusros reader.buildptr(); // get data run = reader.getRun(); } 15/12/2008
Intérieur - editable ● Processus documenté et commenté ● Utilisation de CaptainBol clairement délimitée 15/12/2008
Intérieur - editable /** * this function takes care of the first steps of handling raw files : * - getting the necessary OLE/COM object * - setting up a RunLcmsms object to hold the results * * @param ifname Filename to use * @param ptr Write to a specific RunLcmsms instance. Other wise, if NULL, we allocate one. */ void arthur::initfile(const char *ifname, RunLcmsms *ptr) { // reset the tables // as the spectra are all represented using USHORT in XCalibur, I don't except to have more than 64k spectra to handle parentmap.clear(); parentmap.resize(USHRT_MAX,0); parentsp1.clear(); parentsp1.resize(USHRT_MAX,NULL); parentsp2.clear(); parentsp2.resize(USHRT_MAX,NULL); extractmap.clear(); extractmap.resize(USHRT_MAX,false); // *** EXPORT CAPTAINBOL // allocate an instance if needed... run = ptr ? ptr : new RunLcmsms(); // // Open the file // /** * -=- !!!XDK!!! -=- * XDK presents an API for accessing RAW files which consist of a RAW-file reader (XRaw) * which presents the data in a structured content. * See "Raw File Hierarchy" in the XDK documentation : * C:/Xcalibur/help/xdkhelp/rawfile_hierarchy.htm * (unlike, for example, Analyst Cookbook which present an API more oriented toward piloting Analyst * and presents data in a way which closely maps to various phase of the pipeline) * * in Xcalibur, each RAW file contains one and only one single sample, and all data pertaining it * the sample is the first-grade citizen and everything is structured around it. * * Note about classes : * - every count is 1-based and everything is counted consistently using 1...n like in Basic (not 0...n-1 like in C) * - the classes aren't grouped in a common name space like "Xcalibur.{class}.1" or "XDK.{class}.1" * instead the classes use the same name for name space "{class}.{class}.1" * - several classes have "~Read" equivalent which are read only. */ //DISPATCH_OBJ(raw); try { dhCheck( dhCreateObject(L"XRaw.XRaw.1", NULL, &raw) ); } catch (string errstr) { cerr << "Fatal error - can't create the main XCalibur object (XRaw)" << endl << endl << "Is the library correctly registered ?" << endl 15/12/2008
Intérieur - editable // TODO we can access the parent's TIC using parent.Scan.Header.Tic cout << endl; } END_WITH_THROW(parent); } END_WITH_THROW(parentcol); } catch(string err) { // cout << "\tno parents"; cerr << "Warning, can't get parent informations !!!" << endl << err << endl; } /// /// At THIS point, we have a lot of information gathered. We can start building a spectrum /// // *** EXPORT CAPTAINBOL // No parent ? Use info from Filter if (mass == 0.&& curfilt) mass = curfilt->Parent(); // Charge mapper ChargeMapper chm; if (charge >= 1) chm.addCharge(charge); // spectrum ! SpectrumLcmsms *sp = new SpectrumLcmsms(mass, chm.charges()); if (sp == NULL) { cerr << "Critical Out of memory !!!" << endl; 15/12/2008
Extérieur - connecté ● Ecosystème : Communication inter composants Xenobol : merlinbol & freudbol COM / C++ ... by DrYak Captain-bol Java ProteoLib Serialisation BOOST / C++ Java Google ProtoBuff by Masselot, Collinge & by Masselot, Nikitin & Damage DrYak Müller CUDA / C++ by DrYak Serialisation Google ProtoBuff ... SmileMS Java Mylonas & Mauron 15/12/2008
Extérieur ● Choix de Google Protocol Buffer : ● Ubiquité - existe pour C++ / Java / Python - portage pour Perl / .NET / ...l'évier... ● Compact par exemple codage VARINT (de 1 à 4 byte) pour les entiers ● Simple d'utilisation 15/12/2008
Recommend
More recommend