{"id":2904,"date":"2016-12-09T16:39:38","date_gmt":"2016-12-09T21:39:38","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=2904\/"},"modified":"2017-04-29T17:55:25","modified_gmt":"2017-04-29T21:55:25","slug":"filtrer-des-snps-a-laide-de-pygeno","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/filtrer-des-snps-a-laide-de-pygeno\/","title":{"rendered":"Filtrer des SNPs \u00e0 l&rsquo;aide de pyGeno"},"content":{"rendered":"<p>En parcourant le contenu de notre blogue en plein croissance (beau travail, coll\u00e8gues !), je me rends compte qu&rsquo;aucun de nous n&rsquo;a encore publi\u00e9 un article en rapport avec la fantastique ressource bioinformatique qu&rsquo;est <a href=\"http:\/\/pygeno.iric.ca\/\">pyGeno<\/a> (qui plus est, un logiciel maison).<br \/>\nIl se trouve qu&rsquo;en plus d&rsquo;\u00eatre mon tour de publier un article, je dois justement faire usage de pyGeno afin de g\u00e9n\u00e9rer un jeu de donn\u00e9es, quelle merveilleuse co\u00efncidence !<\/p>\n<p>Je concentrerai cet article sur l&rsquo;\u00e9criture d&rsquo;un <em>SNP filter<\/em>, t\u00e2che qui peut s&rsquo;av\u00e9rer \u00e9trange aux premiers abords.<\/p>\n<p>Pour d\u00e9buter, si vous ne l&rsquo;avez pas encore fait, veuillez survoler les proc\u00e9dures d&rsquo;<a href=\"http:\/\/pygeno.iric.ca\/installation.html\">installation<\/a> et d&rsquo;<a href=\"http:\/\/pygeno.iric.ca\/importation.html\">importation<\/a> car elles ne seront pas discut\u00e9es ici. Je dirai simplement que je travaillerai sur le g\u00e9nome humain <em>GRCh38.83<\/em> avec <em>dbSNP149<\/em> et un jeu de SNPs sp\u00e9cifique \u00e0 mon \u00e9chantillon tel qu&rsquo;identifi\u00e9 \u00e0 l&rsquo;aide de <a href=\"https:\/\/github.com\/ekg\/freebayes\">freebayes<\/a>, jeu que je nommerai ici <em>sampleSNPs<\/em>.  <\/p>\n<p>Donc, pour une raison que je ne citerai pas, je dois <strong>filtrer<\/strong> les SNPs pr\u00e9sents dans le sous-ensemble <a href=\"https:\/\/www.ncbi.nlm.nih.gov\/variation\/docs\/human_variation_vcf\/\">common<\/a> de dbSNP de mes <em>sampleSNPs<\/em> et utiliser ceux qui restent afin de cr\u00e9er le proteome personnalis\u00e9 que les coll\u00e8gues de prot\u00e9omique n\u00e9cessitent pour rouler leurs pipeline d&rsquo;identification.<br \/>\nJe pourrais utiliser des outils tels que les excellents <a href=\"http:\/\/snpeff.sourceforge.net\/SnpSift.html\">SnpSift<\/a>\/<a href=\"http:\/\/snpeff.sourceforge.net\/index.html\">SnpEff<\/a> pour pr\u00e9-traiter mon ensemble de SNPs, mais o\u00f9 serait le plaisir ? \ud83d\ude09<br \/>\nSans compter que les <a href=\"http:\/\/pygeno.iric.ca\/snp_filter.html\">SNP Filters<\/a> de pyGeno sont parfaits pour cette t\u00e2che !<\/p>\n<p>Voici l&rsquo;exemple que la documentation de pyGeno nous fournit:<\/p>\n<pre><code class=\"python\">\r\nclass MyFilter(SNPFilter) :\r\n    def __init__(self, thres) :\r\n        self.thres = thres\r\n        \r\n    def filter(chromosome, SNP_Set1 = None, SNP_Set2 = None ) :\r\n        if SNP_Set1.alt is not None \\\r\n                and (SNP_Set1.alt == SNP_Set2.alt) \\\r\n                and SNP_Set1.Qmax_gt > self.thres:\r\n            return SequenceSNP(SNP_Set1.alt)\r\n        \r\n        return None\r\n<\/code>\r\n<\/pre>\n<p>Assez g\u00e9n\u00e9rique.. Mais tout de m\u00eame un bon point de d\u00e9part.<br \/>\nModifions le un peu afin de filtrer les entr\u00e9es connues de <em>dbSNP149<\/em> et ne conserver que les entr\u00e9es <em>sampleSNPs<\/em> pr\u00e9sentant une qualit\u00e9 sup\u00e9rieure \u00e0 un seuil pr\u00e9-d\u00e9fini.<\/p>\n<pre>\r\n<code class=\"python\">\r\nclass PseudoSomaticFilter(SNPFilter) :\r\n    def __init__(self, thres) :\r\n        self.thres = thres\r\n        \r\n    def filter(chromosome, sampleSNPs = None, dbSNP149 = None ) :\r\n        if dbSNP149 is None and sampleSNPs.quality > self.thres:\r\n            return SequenceSNP(sampleSNPs.alt)\r\n        \r\n        return None\r\n\r\n# instancier l'objet Genome\r\ngenome = Genome(species='human', name='GRCh38.83', SNPs=['sampleSNPs', 'dbSNP149'], \r\n                SNPFilter=PseudoSomaticFilter(20))\r\n# et faire un peu de travail...\r\n<\/code><\/pre>\n<p>Tel que mentionn\u00e9 plus haut, quelques petits trucs peuvent sembler \u00e9tranges de prime abord. Regardons les plus en d\u00e9tails:<\/p>\n<p>Primo, il est important de comprendre \u00e0 quel moment la methode <em>filter<\/em> est appel\u00e9e.<br \/>\nVoici, grosso-modo, ce qui se produit:<\/p>\n<ul>\n<li>Pour chaque position chromosomique couverte par l&rsquo;objet sous investigation (proteine, transcrit, etc..)<\/li>\n<li>pyGeno cherche la pr\u00e9sence de SNPs \u00e0 cette position dans n&rsquo;importe lequel des ensembles de SNPs en m\u00e9moire<\/li>\n<li>Si un SNP est trouv\u00e9, pyGeno soumet une valeur pour <strong>chaque ensemble de SNP<\/strong> \u00e0 la m\u00e9thode <em>filter<\/em><\/li>\n<\/ul>\n<p>Secundo, semble un peu \u00e9trange que l&rsquo;on fasse usage des noms de nos ensembles de SNPs comme param\u00e8tres de la methode <em>filter<\/em>, n&rsquo;est-ce pas ?.<br \/>\nCeci est du au fait que, \u00e0 l&rsquo;interne, pyGeno appelle <em>filter<\/em> en lui passant un dictionnaire qui utilise le nom de l&rsquo;ensemble comme cl\u00e9 de l&rsquo;instance du SNP lui-m\u00eame (ie: <code class=\"python\">{'sampleSNPs': pyGeno_SNP_entry, 'dbSNP149': pyGeno_SNP_entry}<\/code>), et expand le dictionnaire automatiquement \u00e0 l&rsquo;aide de l&rsquo;op\u00e9rateur  <code class=\"python\">**<\/code>. du langage Python.<br \/>\nVoici certainement l&rsquo;aspect qui m&rsquo;a donn\u00e9 le plus de fil \u00e0 retordre lors de mes premi\u00e8res exp\u00e9riences avec ;es <em>SNP Filters<\/em> de pyGeno et sous-tend malheureusement que ceux-ci ne sont pas des composants enti\u00e8rement r\u00e9utilisables. Mais maintenant que vous en \u00eates inform\u00e9s, cet aspect ne devrait plus vous d\u00e9router !<\/p>\n<p>Tertio, comme vous pouvez le voir, j&rsquo;acc\u00e8de l&rsquo;attribut <em>quality<\/em> de mon sampleSNPs afin de le comparer \u00e0 mon seuil et il n&rsquo;y a rien de bizarre l\u00e0-dedans. Il faut cependant garder en t\u00eate que tous les types de SNPs ne pr\u00e9sentent pas tous les m\u00eame attributs.  Dans ce cas-ci, dbSNP149 est un <em>dbSNPSNP<\/em> et sampleSNPs est un <em>AgnosticSNP<\/em>. PyGeno supporte <a href=\"http:\/\/pygeno.iric.ca\/objects.html#module-SNP\">plusieurs types de SNPs<\/a> pour importation et il est important de savoir \u00e0 quel type vous acc\u00e9dez en \u00e9crivant votre SNPFilter afin de vous assurer d&rsquo;avoir acc\u00e8s aux attributs auxquels vous vous attendez.<\/p>\n<p>Finalement, afin de respecter la signature de la fonction, il est important pour notre SNPFilter de retourner l&rsquo;une des <a href=\"http:\/\/pygeno.iric.ca\/snp_filter.html#SNPFiltering.SequenceDel\">entit\u00e9s suivantes<\/a>:<\/p>\n<ul>\n<li>SequenceSNP<\/li>\n<li>SequenceInsert<\/li>\n<li>SequenceDel<\/li>\n<li>None<\/li>\n<\/ul>\n<p>Alors voil\u00e0, un joli <em>SNP Filter<\/em> pour moi et des maux de t\u00eate de d\u00e9butants d&rsquo;\u00e9vit\u00e9s pour vous \ud83d\ude42<br \/>\nAmusez-vous avec pyGeno !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En parcourant le contenu de notre blogue en plein croissance (beau travail, coll\u00e8gues !), je me rends compte qu&rsquo;aucun de nous n&rsquo;a encore publi\u00e9 un article en rapport avec la fantastique ressource bioinformatique qu&rsquo;est pyGeno (qui plus est, un logiciel maison). Il se trouve qu&rsquo;en plus d&rsquo;\u00eatre mon tour de publier un article, je dois justement faire usage de pyGeno afin de g\u00e9n\u00e9rer un jeu de donn\u00e9es, quelle merveilleuse co\u00efncidence ! Je concentrerai cet article sur l&rsquo;\u00e9criture d&rsquo;un SNP filter, <a href=\"https:\/\/bioinfo.iric.ca\/fr\/filtrer-des-snps-a-laide-de-pygeno\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[41,26],"tags":[136,137],"class_list":["post-2904","post","type-post","status-publish","format-standard","hentry","category-bioinformatique","category-langage-python","tag-biologie","tag-genomique"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=2904"}],"version-history":[{"count":10,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2904\/revisions"}],"predecessor-version":[{"id":3281,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2904\/revisions\/3281"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=2904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=2904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=2904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}