 Mon nom est Christian Riley. C'est la première fois, moi aussi, que je suis ici. On dirait que c'est une journée de newbie. Je travaille à l'hôpital du Sacré-Cœur dans le centre d'études avancées en médecine du Sommeil. Je vais parler d'outils codés en piton pour l'analyse scientifique de l'électroencephalogramme. Je vais essayer de ne pas être trop scientifique. J'espère que ça va avoir un intérêt pour plusieurs d'entre vous. Je vais présenter quatre programmes. Il y en a un qui est peut-être un petit peu plus collé sur les applications directes de l'électroencephalogramme. Les trois autres ont peut-être un intérêt un petit peu plus large. Je vais commencer par présenter le contexte dans lequel ces projets-là s'insèrent. Je vais présenter les objectifs généraux qui ont guidé leur développement, présenter les projets comme tel et ensuite, je vais conclure. En ce qui concerne le contexte, je travaille dans le domaine de l'étude du Sommeil. Pourquoi on veut utiliser le Sommeil en général? Deux grandes raisons, premièrement, c'est parce qu'on s'intéresse à la médecine du Sommeil pour aider des personnes, soit des patients qui souffrent de différents troubles du Sommeil, dont par exemple l'apnée du Sommeil, il y a des personnes qui arrêtent de respirer pendant qu'ils dorment. Des insomnies, d'hyper-somnies, des personnes qui arrivent pas à rester réveillées plus de quatre heures par jour. Du sommeil ambuliste, vous savez tous si c'est quoi. Il y en a plusieurs autres que je n'ame pas ici mais il y a plusieurs maladies associées au Sommeil qui sont très invalidantes. L'autre raison, ça peut être pour plus une quête de savoir, donc comprendre les rôles et les mécanismes associés au Sommeil en neurosciences. Quand on étudie le Sommeil, on l'utilise normalement avec la polysomnographie. La polysomnographie, c'est un mot qui englobe plusieurs modalités d'arrustrement, soit l'électroencephalographie pour le cerveau, l'électrocardiographie pour le coeur, l'électromiographie pour l'activité des muscles, pour savoir si les muscles ont de l'attention, l'électroculographie pour voir les mouvements des yeux, éloximétrie pour l'oxygène dans le sang, et en le doute, ça dépend des laboratoires. Mais ça, c'est vraiment le coeur si on veut. Donc typiquement, on invite un sujet ou un patient dans un laboratoire. Ils plaquent des électrodes partout et on le fait dormir toute une nuit en enregistrant tous ces signaux. Ça donne quelque chose de même qu'on doit analyser. C'est une grosse partie de mon travail et puisque je suis un fan de piton, je décide de faire ça en piton. Contexte et développement. Je pense qu'il y a trois grands contextes de développement. En fait, du logiciel, il y a l'Université, l'Open Source et l'entreprise privée. À la jonction entre l'Université et l'Open Source, il y a l'Open Science. Elle est aussi très populaire à la jonction entre l'entreprise privée et l'Université. Il y a les partenariats à l'entreprise d'Université parce que les gouvernements ne veulent plus payer la recherche, donc ils essaient de faire des partenariats. Et il y a aussi des entreprises Open Source. Red Hat est peut-être un bon exemple d'entreprise Open Source. Présentement, le projet, il vient de cette sphère-là. Il essaie d'aller ici et l'objectif final, ça serait d'aller dans le Nord-Mensland ici. Je suis toujours intéressé par tout commentaire à ce sujet-là. Il y a comme un modèle à penser pour comment faire profiter les intérêts de tout ce monde-là en même temps. Je pense que ce serait quelque chose d'intéressant. Donc le développement se rire dans cette direction-là. Les grands objectifs que je visais dans le développement de ces outils-là, premièrement l'ouverture, donc c'est du code source ouvert, c'est un peu des projets ouverts à la participation de tous, traceabilité, c'est la possibilité de pouvoir en tout temps retracer tout ce qui a servi à générer des résultats. En fait ce qui arrive souvent, c'est qu'on a des résultats, des graphiques dans des publications scientifiques et on serait bien embêté que quelqu'un nous demande peut-il recalculer ce graphique-là parce qu'on a changé nos scripts, on ne sait plus c'est quel de nos 15-7 de données qui ont servi. Donc c'est d'avoir une traceabilité qui permet en tout temps, à partir d'un résultat obtenu, de tracer les données de départ, les opérations effectuées, les versions des algorithmes utilisées pour pouvoir avoir une reproductivité, c'est-à-dire pouvoir en tout temps reproduire n'importe quel résultat. C'est des objectifs, c'est pas nécessairement encore atteint, mais c'est vraiment les objectifs. Productivité, donc c'est l'idée, c'est vraiment en recherche-là, on est toujours, je pense, en développement aussi, toujours pressé, on cherche toujours à gagner du temps. Donc minimiser le temps des requis pour faire les analyses de données, c'est vraiment un des gros objectifs. Maximiser la convivialité pour deux types d'utilisateurs, des utilisateurs que j'appelle techniques, donc des gens comme vous, des gens comme moi, des ingénieurs, et des utilisateurs non techniques, donc des médecins et d'une neuropyscologue qui ont des analyses à faire, mais qui ne sont pas prêts à rentrer dans du code. Donc pour ça, c'est d'avoir des interfaces de haut niveau, très conviviales, mais avoir aussi un accès au détail de bon niveau. Souvent, dans des applications, il y a un compromis. On va avoir une interface super conviviale, mais les personnes qui sont plus techniques n'ont pas accès au détail, ou bien ça va être quelque chose de très proche du développement, mais qui manque de convivialité pour les utilisateurs qui ont moins de connaissances. Donc c'est d'essayer de trouver un cadre qui permet de joindre ces deux objectifs-là. La possibilité, en fait, c'est l'idée de permettre à des utilisateurs non techniques de faire des analyses de données qui normalement seraient hors de leur portée parce qu'ils n'ont pas des connaissances techniques pour aller coder des types d'analyse qui n'existent pas déjà dans des outils, par exemple, dans des outils commerciaux. Donc, il y a quatre projets dont je vais vous parler. Donc Spindle, Blackwork, Navigator et Analyzer. Spindle, c'est une boîte d'outils, une boîte d'outils regroupant de différentes algorithmes. En fait, dans mon travail, je développe des algorithmes pour faire des nouveaux types d'analyse. Spindle est vraiment le moyen de les rendre publics et aussi d'intégrer différents types d'analyse qui sont connus dans la littérature, mais pour lesquels il n'y a aucune base de code qui est open source. Donc, c'est un projet qui est hébergé sur Bitbucket. Donc, c'est une librairie. C'est le back-end. C'est plus pour les utilisateurs techniques. L'issence GPL pour l'application non-commerciale. Puis, c'est un habitant 2.7. J'aimerais passer à 3.3, mais pour l'instant il y a plusieurs librairies que j'ai de besoin qui ne sont pas encore en 3.3. Donc, c'est un peu bloqué ici, mais ça devrait passer à 3.3 bientôt. Donc, qu'est-ce qu'il y a dans Spindle? Il y a plusieurs types de trucs. Il y a des détecteurs de fuseaux. Qu'est-ce que c'est des fuseaux? On les voit ici entre les deux bars rouges. C'est des bouffées d'activité dans une bande de fréquences assez restreintes d'une durée en 0.5 et 4 secondes. Les neuropsychologues sont bien intéressés à pouvoir détecter ça parce que c'est associé à un paquet de phénomènes. Donc, c'est un problème assez important. Comment on les détecte? Normalement, on part d'un signal. On va appliquer une transformation. Il y en a quatre d'implémentés dans l'outil Spindle pour passer de ce signal-là à ce signal-là, qui est une sorte de courbe de probabilité de présence d'un fuseau. À partir de ça, on va appliquer un seuil puis on va déterminer la présence de fuseaux si le signal va au-dessus du seuil pour une durée entre 0.5 et 4 secondes. Spindle permet aussi de faire des analyses de propagation. Disons qu'on détecte un fuseau sur cet électrode-là de savoir dans quelle direction qu'il part. Est-ce qu'on le détecte sur d'autres électrodes? Comment il se propage avec quel temps de délai ce genre de choses-là? Spindle a aussi des routine entrées sorties pour différents types de fichiers. Ça, c'est des fichiers propriétaires. Il y a des fichiers plus formaux verts. Il permet aussi de décrire dans le format EDF-BDF qui sont des formaux verts. J'aimerais aller vers une centralisation dans une base SQL pour la question de la traceabilité dont j'ai parlé un peu plus tôt. Mais ce n'est pas encore fait d'où le griser un peu. Différents types d'outils pour faire de l'analyse des signals sont aussi inclus. Il y a des filtrats. Passes bas, passes hauts, passes bandes. Représentation de temps fréquence. On a un signal qui varie en fonction du temps. On peut faire son analyse fréquentielle avec une FFT. On va avoir une carte de dimension qui nous donne la variation du spec fréquentiel en fonction du temps. On le fait ici avec une transformée en F. C'est un autre outil de traitement de signal inclus. Il y en a plusieurs autres. On peut faire des affichages de cartes topographiques des graves de propagation où les flèches indiquent les directions de propagation avec les temps de déla associés. Ça, c'est Spindle Navigator. C'est très simple. C'est une interface utilisateur permettant de visualiser les données électroencephalographiques traitées avec Spindle. C'est encore révergé sur Bitbucket. C'est une interface utilisateur en PQT et QWT. J'aimerais bien être sur Psyde, malheureusement, à cause de QWT qui n'est pas porté sur Psyde. C'est pas possible pour l'instant. Encore GPL pour l'application non-commerciale. Même chose pour la version de Python. Ici, c'est un exemple de l'interface graphique que ça donne. On peut choisir les différents canaux qu'on va afficher. On peut changer les couleurs de signaux. Ça a de l'air trivial. On regarde en même temps des signaux d'électrocardiogramme, d'électroencephalographie et d'autres types de signaux. On peut vouloir regrouper par couleur les différents types de signaux pour pouvoir se retrouver plus facilement. On peut afficher des catégories d'événements, par exemple les fuseaux détectés. On peut voir les différentes propriétés, afficher où se trouvent les événements, les différents événements détectés et d'autres fonctionnalités. Ce programme-là, il est vraiment juste pour offrir une visualization graphique. Sinon, avec juste spindle, on travaille sur des données, mais on ne sait pas ce qui se passe en arrière. Ça, c'est vraiment juste pour avoir un visualisateur. Blockwork. Blockwork, c'est une boîte d'outils servant à exécuter de façon distribuée des traitements de données complexes implementés sous la forme de chemo-block. C'est sur Bitbocket. C'est une librairie. C'est plus le back-end si on veut, c'est plus pour les utilisateurs techniques. Même licence, même version de Python. Le concept, en ingégrés, on aime bien représenter sous forme de chemo-block les différents systèmes qu'on a à développer. Par exemple, ici, on a une fonction glob. On part d'un patron avec des wildcards dedans. On va lister un ensemble de fichiers. Donc, on veut prendre l'ensemble de ces fichiers pour chacun des fichiers, lister les canaux qui sont disponibles, parce que c'est des données âgées. Pour chacun des fichiers, on veut extraire les fuseaux pour un type de détecteur donné. On va attribuer un nom d'événement juste pour voir s'y retrouver après. Et on va avoir en sorti les fuseaux pour un fichier qui sont disponibles. Ça, c'est ce que j'appelle un chemo-block canonique. Pourquoi je l'appelle canonique? Parce qu'il y a ici des flèches doubles. En fait, c'est des flèches qui sont, si on veut, d'un à plusieurs. Donc, des relations one-to-many. Donc, on peut développer ce chemo-block. Par exemple, ici, on prenait chacun le bloc glob, liste n fichiers. Pour chacun des n fichiers dans le fond, c'est que ça va reproduire le même chose ici avec les canaux, où il peut avoir M canaux. Donc, pour chacun de ces canaux-là, on va avoir encore toute la série de blocs qui va découler. Le chemo-developpée est inconnu à priori parce que on ne sait pas combien qu'on va avoir d'événement à priori. On ne sait pas combien de canaux qu'il va avoir par fichier. Donc, on ne peut pas tracer ce grapho-là à priori. Donc, on peut juste partir du chemo-canonique. C'est ça le chemo-canonique va se développer au fur et à mesure de l'exécution pour, à la fin, avoir le chemo-block développé et les résultats de nos traitements de données. Donc, comment ces chemo-block-là sont exécutés à l'intérieur de bloc-work? En fait, si on prend un autre calcul, donc, une machine, quelqu'un qu'on veut utiliser pour faire du calcul, on va s'ouvrir un pool de travailleurs. Si j'ai maintenant 12 processeurs, je vais prendre 11 travailleurs pour pas bloquer, pour avoir un processeur de libre pour avoir un minimum d'interactivité. Donc, j'ai chacun mes haines de travailleurs qui sont des objets exécutants dans leur propre processus. Je peux avoir d'autres nœuds sur le réseau qui vont travailler tous ensemble. Je vais avoir un chemo-canonique qui va être un objet piton standard qui va envoyer les blocs qu'il contient à une salle d'attente qui est un objet réseau. Pour ceux qui connaissent Piro, c'est donc un objet réseau. Donc, tous les travailleurs, surtout les nœuds de calcul peuvent communiquer avec ces objets-là. Donc, la salle d'attente va passer ces blocs. En fait, les travailleurs, quand ils vont être libres, ils vont aller chercher un bloc dans la salle d'attente dans mesure où il y a des blocs qui attendent. Ils vont les exécuter et en les exécutant, ils vont peut-être générer d'autres blocs. Les travailleurs ici prennent le bloc globe et que le bloc globe sort 20 fichiers, il va générer 20 blocs qui vont être envoyés dans la salle d'attente. Et les travailleurs vont aussi enregistrer les états d'exécution dans le régime. Donc, est-ce que le bloc a commencé son exécution, est-ce qu'il a terminé son exécution? Comme ça, si on a 2 jours de calcul à faire et que ça plante après une journée, on peut repartir où on est rendu. Tous les messages qui vont être générés par les travailleurs vont être transmis à une centrale de communication qui est un autre objet réseau. Donc, dans le fond, les flèches partent de tous les nœuds du réseau. Et un objet piton standard qui va être un afficheur, un consumer, si on veut dans les patrons de programmation va consommer si on veut les messages, si on a la centrale de communication pour donner une sortie. Comment on n'utilise ça pour de façon plus conviviale? C'est Analyzer qui permet de faire ça. C'est une interface graphique permettant une station conviviale et efficace de blockwork pour l'implémentation schématique de traitement donné mettant en œuvre des algorithmes de spindle et d'autres algorithmes. Là, on pourrait mettre n'importe quel algorithme. Donc, c'est encore là sur BitBucket. C'est donc une interface utilisateur Frontend en PSIDE même licence, même version piton. Donc, l'interface ressemble un peu à ça. On a dans le fond une liste de schémas ici. On peut quand on a des schémas qui sont écrits, on les enregistre dans un format de fichier, on peut les charger ici. On peut démarrer le schéma sélectionné. On a ici la visualization du schéma canonique. Quand on exécute, le schéma se développe. Ici, on choisit la vision développée. On a le schéma développé qui s'affiche ici. Ça continue loin en haut et loin en bas. Le code de couleur, les blocs comme bleu parle, c'est des blocs qui n'ont pas encore été exécutés. Les blocs rouges et des blocs dans l'exécution est terminé. Les blocs jaunes qu'on peut voir ici, c'est des blocs qui sont en train de s'exécuter. Donc, il y a un processus dans un train de rouler ça, un processus dans un autre ordinateur ou un autre core qui est en train de rouler celui-là. On a une couleur pour les blocs où il y aurait des erreurs. On peut sélectionner le bloc, on peut visualiser les propriétés du bloc, les messages obtenus lors de l'exécution du bloc. On peut sélectionner le nombre de processus locaux qu'on veut, donc ici 11. On va avoir une liste de 11 travailleurs avec chacun l'heure qui est affichée. On peut aussi se démarrer des nouveaux réseaux. Ça fait le tour. En résumé, c'est 4 ou 6 pitons qui ont été développés pour le traitement des données gées. Avec l'objectif de pouvoir passer des traitements qui peuvent être assez longs, parce que c'est des nuits qui ont été développés pour 200 patients à 500 Hz. Vous pouvez imaginer si vous avez des algorithmes un peu compliqués, ça peut être long. L'idée est de pouvoir rouler ça en parallèle de façon distribuée et efficace. Deux de ces outils sont plus pour des utilisateurs techniques. Spindle et Blockwork. Deux pour des utilisateurs non-techniques. Plus les médecins et les neuropsychologues. C'est Analyzer qui est éteint. Certains projets ont une applicabilité plus large, par exemple Blockwork. Je pense que Blockwork pourrait être utilisé pour n'importe quel traitement donné, n'importe quel traitement en Big Data. Si vous avez des traitements qui exigent beaucoup de temps de calcul que vous pouvez représenter sur la forme d'un chemo block, c'est une approche qui peut être intéressant. Il y a beaucoup de travail à faire. C'est beau. Mais c'est ouvert à la participation. Donc beaucoup de travail à faire pour des ajoutes de fonctionnalité, des tests, du débagage, la documentation évidemment. C'est des projets qui sont ouverts à la communauté. Ce sont des projets qui sont démarrés depuis un an. Je ne fais pas juste ça à temps plein. Mais c'est quand même une bonne partie de mon travail. Et voilà. Merci pour des quelques ressources si vous voulez me contacter, courriel, téléphone. Les projets peuvent se trouver ici. Quelques articles pour des références. Merci pour votre invitation. Merci pour les organisateurs de Montréal Python de permettre ces événements.