<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Xtof78000's Weblog</title>
	<atom:link href="http://xtof78000.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://xtof78000.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 20 May 2008 09:16:00 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='xtof78000.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Xtof78000's Weblog</title>
		<link>http://xtof78000.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://xtof78000.wordpress.com/osd.xml" title="Xtof78000&#039;s Weblog" />
	<atom:link rel='hub' href='http://xtof78000.wordpress.com/?pushpress=hub'/>
		<item>
		<title>20 mai 2008 &#8211; montage d&#8217;un systeme de fichier distant (berthemorisot sur douanierousseau)</title>
		<link>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-montage-dun-systeme-de-fichier-distant-berthemorisot-sur-douanierousseau/</link>
		<comments>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-montage-dun-systeme-de-fichier-distant-berthemorisot-sur-douanierousseau/#comments</comments>
		<pubDate>Tue, 20 May 2008 09:16:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-montage-dun-systeme-de-fichier-distant-berthemorisot-sur-douanierousseau/</guid>
		<description><![CDATA[11h13J&#8217;ai 2 machines, douanierousseau fonctionnant avec ubuntu feisty 7.04 et berthemorisot avec Centos 4berthemorisot est le serveur de l&#8217;unité.on y stock bcp de choses.c&#8217;est aussi la que se trouvent les script créer pour le labo et fonctionnant avec une interface webLe but : avoir un répertoire sur ma machine qui reprend le système de fichier [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=87&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">11h13</span><br />J&#8217;ai 2 machines, douanierousseau fonctionnant avec ubuntu feisty 7.04 et berthemorisot avec Centos 4<br />berthemorisot est le serveur de l&#8217;unité.<br />on y stock bcp de choses.<br />c&#8217;est aussi la que se trouvent les script créer pour le labo et fonctionnant avec une interface web<br />Le but : avoir un répertoire sur ma machine qui reprend le système de fichier de berthemorisot.<br />Comment faire : en utilisant nfs (Network File System)<br />il faut configuere les deux coté, le serveur qui va fournir les fichier et le client qui va les lire.<br />donc ici le serveur est berthemorisot et le client douanierousseau.</p>
<p>1- configuration de berthemorisot<br />je m&#8217;aide de cette page<br /><a href="http://http//www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-nfs-server-export.html">http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-nfs-server-export.html</a><br />je configure le fichier <code>/etc/exports</code> pour que douanierousseau soit accepté comme client et que ce soit le repertoire <code>/home/gim</code> qui soit partagé<br />j&#8217;ecris dans ce fichier :<br /><code>/home/gim/ douanierousseau.gim.pasteur.fr(rw,all_squash)</code></p>
<p>puis je lance le serveur nfs<br /><code>sudo /sbin/service nfs start</code></p>
<p>pour le serveur, c&#8217;est fini, passons au client</p>
<p>2- douanierousseau<br />je m&#8217;aide de cette page<br /><a href="http://doc.ubuntu-fr.org/nfs">http://doc.ubuntu-fr.org/nfs</a><br />j&#8217;installe le paquet nfs-common<br />le point de montage sera <code>/home/gim2/berthe/</code></p>
<p>et je rajoute la ligne<br /><code>berthemorisot.gim.pasteur.fr:/home/gim  /home/gim2/berthe       nfs     user    0       0</code><br />dans <code>/etc/fstab</code></p>
<p>si le point de montage est tjs vide alors je fais<br /><code>sudo mount -t nfs berthemorisot.gim.pasteur.fr:/home/gim /home/gim2/berthe</code></p>
<p>ca marche bien mais je n&#8217;ai pas les droit de modification sur les fichiers, c&#8217;est chiant</p>
<p>je modifie alors plusieurs choses<br />d&#8217;une par je fais en sorte que l&#8217;utilisateur distant soit identifié comme l&#8217;utilisateur gim en modifiant <code>/etc/exports</code><br />je tape la la ligne<br /><code>/home/gim/ douanierousseau.gim.pasteur.fr(rw,all_squash,anonuid=501,anongid=100,)<br /></code><br />501 étant le code de l&#8217;utilisateur gim et 100 celui du group users</p>
<p>et aussi sur douanier rousseau je remplace l&#8217;id de l&#8217;utilisateur gim2 qui était 1000 par 501 en modifiant le fichier <code>/etc/passwd</code><br />j&#8217;ai donc maintenant accès a berthemorisot sans probleme.<br />j&#8217;ai modifié <code>/usr/sbin/ntsysv</code>, pour que nfs démarre au démarrage du serveur</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/87/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/87/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=87&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-montage-dun-systeme-de-fichier-distant-berthemorisot-sur-douanierousseau/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>
	</item>
		<item>
		<title>20 mai 2008 &#8211; analyse des résultat de sage &#8211; restriction WT et double mutant (suite)</title>
		<link>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant-suite/</link>
		<comments>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant-suite/#comments</comments>
		<pubDate>Tue, 20 May 2008 08:43:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[CUTs]]></category>
		<category><![CDATA[Matlab]]></category>
		<category><![CDATA[Oligo-dT]]></category>
		<category><![CDATA[sage]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant-suite/</guid>
		<description><![CDATA[10h40après avoir obtenu les segment, je vais donc chercher a les localiser par rapport aux orf environnantes.Tout d&#8217;abord j&#8217;exporte la liste des segment sur douanierousseauscp berthe:sage/total/stats/ratio2_5/WT&#38;mutant/segments_WT_CUTs ~/sage/total/stats/ratio2_5/WT&#38;mutant/ensuite j&#8217;utilise segment.py (dans le workspace genepy) pour transformer ce fichier du format matlab au format csv puis pour localiser les orfj&#8217;ai modifier légèrement segment.py pour que les nom [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=86&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">10h40</span><br />après avoir obtenu les segment, je vais donc chercher a les localiser par rapport aux orf environnantes.<br />Tout d&#8217;abord j&#8217;exporte la liste des segment sur douanierousseau<br /><code>scp berthe:sage/total/stats/ratio2_5/WT&amp;mutant/segments_WT_CUTs</code> ~/<code>sage/total/stats/ratio2_5/WT&amp;mutant/</code><br />ensuite j&#8217;utilise segment.py (dans le workspace genepy) pour transformer ce fichier du format matlab au format csv puis pour localiser les orf<br />j&#8217;ai modifier légèrement segment.py pour que les nom des colonnes correspondent bien a ce qui est dedans.</p>
<p>j&#8217;obtiens le fichier <code>segments_WT_CUTs_density_max.csv</code> que j&#8217;exporte sur bambino pour appliquer la macro excel de <code>search_features_A_and_B.xls</code> dessus<br />j&#8217;enregistre les résultats dans <code>segments_WT_CUTs_density_max.xls</code> et j&#8217;exporte dans le fichier <code>segments_WT_CUTs_dist_to_feature.txt</code><br />j&#8217;élimine les colonne de texte et j&#8217;enregistre en csv<br />puis j&#8217;exporte sur berthemorisot et je l&#8217;importe dans matlab</p>
<p>j&#8217;obtiens la matrice seg_WT_CUTs_dist2feature et la matrice colheader_seg_WT_CUTs_dist2feature qui contient les intitulés des colonnes.<br />je représentes les nb de segment de chaque type en fontion de leur distance respectives avec soit le debut ou la fin des orf<br />j&#8217;ai écrit un script qui traces les courbes de façon automatique en<br />mettant la plupart des bon parametres<br /><code><br />function [distance_hist]=plot_dist2feature(data, n, smooth_window)</p>
<p>extreme=cell(1,2);<br />extreme{1,1}='start';<br />extreme{1,2}='stop';</p>
<p>sens=cell(1,2);<br />sens{1,1}='sens';<br />sens{1,2}='antisens';</p>
<p>classe=cell(2,2);<br />classe{1,1}='Oligo-dT';<br />classe{2,1}=8:10;<br />classe{1,2}='CUTs';<br />classe{2,2}=1:2;</p>
<p>cols=cell(4,3);</p>
<p>cols{1,1}='start';<br />cols{1,2}='sens';<br />cols{1,3}=[8 10 16];</p>
<p>cols{2,1}='start';<br />cols{2,2}='antisens';<br />cols{2,3}=[12 14 18];</p>
<p>cols{3,1}='stop';<br />cols{3,2}='sens';<br />cols{3,3}=[9 11 17];</p>
<p>cols{4,1}='stop';<br />cols{4,2}='antisens';<br />cols{4,3}=[13 15 19];</p>
<p>max_plot=0;<br />min_plot=0;<br />distance_hist=cell(8,5);<br />i=1;<br />for id_classe=1:2<br />for id_extreme=1:2<br />for id_sens=1:2<br />   for j=1:4<br />       feature_extreme=extreme{1,id_extreme};<br />       feature_sens=sens{1,id_sens};<br />       if strcmp(cols{j,1}, feature_extreme) &amp;&amp; strcmp(cols{j,2}, feature_sens)<br />           columns=cols{j,3};<br />       end<br />   end</p>
<p>   distance_hist{i,1}=mk_distance_hist(data, classe{2,id_classe}, columns, -1000, 1000, n, 20);<br />   distance_hist{i,2}=feature_extreme;<br />   distance_hist{i,3}=feature_sens;<br />   distance_hist{i,4}=classe{1,id_classe};<br />   distance_hist{i,5}=n;<br />   h=zeros(2001,1);<br />   tmp = distance_hist{i,1};<br />   h(min(tmp)+1001:max(tmp)+1001)=hist(tmp,max(tmp)-min(tmp)+1)';<br />   distance_hist{i,6}=h;<br />   distance_hist{i,7}=smooth(h, smooth_window, 0);<br />   i=i+1;<br />end<br />end<br />end<br />zero_line=[0 0];<br />figure<br />set(gcf,'Color','k');<br />plot_ids = 1:2:7;<br />for i=1:4<br />if i max_plot<br />max_plot= limite(2);<br />end<br />end</p>
<p>for i=1:4<br />subplot(2,2,i)<br />ylim([min_plot max_plot]);<br />line(xlim, zero_line, 'Color', 'w');<br />line(zero_line, ylim, 'Color', 'w');<br />end<br /></code></p>
<p>j&#8217;ai rajouté qq éléments sur le graphique.<br />ce qui me donne ca pour n=4 :<br /><a href="http://bp2.blogger.com/_90Wu6Gs32-U/SDVFjClbkiI/AAAAAAAAAUk/7IjUQcPTiow/s1600-h/dist_seg_cut_oligo_to_fetaure_n4.png"><img style="cursor:pointer;" src="http://bp2.blogger.com/_90Wu6Gs32-U/SDVFjClbkiI/AAAAAAAAAUk/7IjUQcPTiow/s400/dist_seg_cut_oligo_to_fetaure_n4.png" alt="" border="0" /></a></p>
<p>quelques chiffres sur ces données<br />on a sélectioné uniquement les tag provennant de la souche sauvage (oligo-dT) et du double mutant Trf4/Rrp6 (CUTs)<br />on a :</p>
<p>oligo-dT -&gt; 49284 tags<br />Cuts -&gt;  66884 tags</p>
<p>environ 1/3 des tags des Cuts a été éliminé de façon aléatoire afin d&#8217;avoir le meme nombre pour les 2 catégories.</p>
<p>on a alors</p>
<p>oligo-dT -&gt; <span style="font-weight:bold;">49284</span> tags<br />Cuts -&gt;  <span style="font-weight:bold;">49077</span>  tags</p>
<p>il y a au total <span style="font-weight:bold;">98361</span> tags</p>
<p>la détection des segments sur ces tags<br />permet de trouver <span style="font-weight:bold;">12021</span> clusters<br />ces clusters contiennent au moins 1 tag<br />si on augmente le nb minimal de tag on a :</p>
<p>1-&gt;        12021<br />2-&gt;        6001<br />3-&gt;        4047<br /><span style="font-weight:bold;">4-&gt;        3069</span><br /><span>5-&gt;        2482</span><br />6-&gt;        2072<br />7-&gt;        1791<br />8-&gt;       1572<br />9-&gt;        1410<br />10-&gt;        1277</p>
<p>le calcul du ratio Oligo-dT / (CUTs + Oligo-dT) puis le fractionnement des clusters dans 10 classes en fonction de ce ratio donne</p>
<table rules="none" border="0" cellspacing="0">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<col width="86">
<tbody>
<tr>
<td width="86" align="left" height="16">Nb tag minimum</td>
<td width="86" align="right">Classes -&gt;<br />1</td>
<td width="86" align="right">2</td>
<td width="86" align="right">3</td>
<td width="86" align="right">4</td>
<td width="86" align="right">5</td>
<td width="86" align="right">6</td>
<td width="86" align="right">7</td>
<td width="86" align="right">8</td>
<td width="86" align="right">9</td>
<td width="86" align="right">10</td>
</tr>
<tr>
<td align="right" height="16">1</td>
<td align="right">6168</td>
<td align="right">179</td>
<td align="right">94</td>
<td align="right">178</td>
<td align="right">330</td>
<td align="right">60</td>
<td align="right">161</td>
<td align="right">216</td>
<td align="right">200</td>
<td align="right">4435</td>
</tr>
<tr>
<td align="right" height="16">2</td>
<td align="right">2573</td>
<td align="right">179</td>
<td align="right">94</td>
<td align="right">178</td>
<td align="right">330</td>
<td align="right">60</td>
<td align="right">161</td>
<td align="right">216</td>
<td align="right">200</td>
<td align="right">2010</td>
</tr>
<tr>
<td align="right" height="16">3</td>
<td align="right">1568</td>
<td align="right">179</td>
<td align="right">94</td>
<td align="right">178</td>
<td align="right">97</td>
<td align="right">60</td>
<td align="right">161</td>
<td align="right">216</td>
<td align="right">200</td>
<td align="right">1294</td>
</tr>
<tr>
<td style="font-weight:bold;" align="right" height="16">4</td>
<td style="font-weight:bold;" align="right">1169</td>
<td style="font-weight:bold;" align="right">179</td>
<td style="font-weight:bold;" align="right">94</td>
<td style="font-weight:bold;" align="right">62</td>
<td style="font-weight:bold;" align="right">97</td>
<td style="font-weight:bold;" align="right">60</td>
<td style="font-weight:bold;" align="right">59</td>
<td style="font-weight:bold;" align="right">216</td>
<td style="font-weight:bold;" align="right">200</td>
<td style="font-weight:bold;" align="right">933</td>
</tr>
<tr>
<td align="right" height="16">5</td>
<td align="right">935</td>
<td align="right">179</td>
<td align="right">46</td>
<td align="right">62</td>
<td align="right">58</td>
<td align="right">60</td>
<td align="right">59</td>
<td align="right">148</td>
<td align="right">200</td>
<td align="right">735</td>
</tr>
<tr>
<td align="right" height="16">6</td>
<td align="right">787</td>
<td align="right">140</td>
<td align="right">46</td>
<td align="right">42</td>
<td align="right">58</td>
<td align="right">30</td>
<td align="right">59</td>
<td align="right">107</td>
<td align="right">200</td>
<td align="right">603</td>
</tr>
<tr>
<td align="right" height="16">7</td>
<td align="right">691</td>
<td align="right">117</td>
<td align="right">46</td>
<td align="right">27</td>
<td align="right">40</td>
<td align="right">30</td>
<td align="right">46</td>
<td align="right">107</td>
<td align="right">176</td>
<td align="right">511</td>
</tr>
<tr>
<td align="right" height="16">8</td>
<td align="right">621</td>
<td align="right">100</td>
<td align="right">37</td>
<td align="right">27</td>
<td align="right">32</td>
<td align="right">20</td>
<td align="right">46</td>
<td align="right">97</td>
<td align="right">152</td>
<td align="right">440</td>
</tr>
<tr>
<td align="right" height="16">9</td>
<td align="right">572</td>
<td align="right">85</td>
<td align="right">28</td>
<td align="right">24</td>
<td align="right">29</td>
<td align="right">20</td>
<td align="right">41</td>
<td align="right">85</td>
<td align="right">137</td>
<td align="right">389</td>
</tr>
<tr>
<td align="right" height="16">10</td>
<td align="right">538</td>
<td align="right">73</td>
<td align="right">19</td>
<td align="right">18</td>
<td align="right">24</td>
<td align="right">16</td>
<td align="right">37</td>
<td align="right">74</td>
<td align="right">121</td>
<td align="right">357</td>
</tr>
</tbody>
</table>
<p>on va considerer que les CUTs sont les segments des classes 1 et 2 et les oligo-dT ceux des classes 8,9 et 10. de plus on ne va s&#8217;intéresser qu&#8217;aux segments ayant au moins 4 tags<br />ce qui fait<br />CUTs -&gt; 1348 segments<br />oligo-dT -&gt; 1349 segments</p>
<p>dans ces segments on a<br />38 % (508 segments) des oligo-dT sont entre 600 et 0 avant le start des orf en sens<br />88 % (1198 segments) des oligo-dT sont entre 0 et 400 après le stop des orf en sens<br />48 % (646 segments) des oligo-dT sont entre -100 et 400 par rapport au stop des orf en antisens<br />45 % (605 segments) des CUTs sont entre -600 et 400 par rapport au start des orf en sens<br />45 % (613 segments) des CUTs sont entre -1000 et -200 par rapport au start des orf en antisens<br />40 % (538 segments) des CUTs sont entre -600 et 100 par rapport au stop des orf en antisens</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/86/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/86/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=86&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/05/20/20-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp2.blogger.com/_90Wu6Gs32-U/SDVFjClbkiI/AAAAAAAAAUk/7IjUQcPTiow/s400/dist_seg_cut_oligo_to_fetaure_n4.png" medium="image" />
	</item>
		<item>
		<title>15 mai 2008 &#8211; analyse des résultat de sage &#8211; restriction WT et double mutant</title>
		<link>http://xtof78000.wordpress.com/2008/05/15/15-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant/</link>
		<comments>http://xtof78000.wordpress.com/2008/05/15/15-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant/#comments</comments>
		<pubDate>Thu, 15 May 2008 08:27:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[CUTs]]></category>
		<category><![CDATA[densité]]></category>
		<category><![CDATA[Matlab]]></category>
		<category><![CDATA[sage]]></category>
		<category><![CDATA[segment]]></category>
		<category><![CDATA[Wild type]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/05/15/15-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant/</guid>
		<description><![CDATA[10h25Je vais reprendre l&#8217;analyse des sage a la base en ne prennant en compte que les tag obtenu sur les manip wild type et double mutant Trf4/Rrp6 Je dois refaire le clustering afin de n&#8217;avoir que des segment correspondant a des groupes de tag de ces manip. 1- ouverture dans matlab du fichier~/sage/total/stats/tag_tot_genome.mat j&#8217;ai dans [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=85&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">10h25</span><br />Je vais reprendre l&#8217;analyse des sage a la base en ne prennant en compte que les tag obtenu sur les manip wild type et double mutant Trf4/Rrp6</p>
<p>Je dois refaire le clustering afin de n&#8217;avoir que des segment correspondant a des groupes de tag de ces manip.</p>
<p>1- ouverture dans matlab du fichier<br /><code>~/sage/total/stats/tag_tot_genome.mat</code></p>
<p>j&#8217;ai dans ce fichier les matrice correspondant aux 12 manip de sage (header01 à header12)<br />chaque matrice à une taille de 24 million ce qui corresponde au nombre de nucleotide de l&#8217;ensemble du génome mis bout a bout en séparant les brin C et W<br />les matrice chr_len et chr_ref donnent les positions de chaque chromosome dans cette matrice</p>
<p>2- la recherche des segments (cluster) va se faire uniquement sur les manip 1 et 8, correspondant au Wild Type (WT) et au double mutant Trf4/Rrp6</p>
<p>3- j&#8217;utilise le programme segment.m avec la commande<br />header = header01 + header08;<br />header(:,2) = header01;<br />[header_region] = segment(header, dt, nt, chr_ref);<br />je récupère la matrice ratio2_1_100_1 qui a été crée<br />et je représente les histogramme des classe de ratio
<pre>figurefor i=1:9subplot(3,3,i)hist(ratio2_1_100_1(find(ratio2_1_100_1(:,4)&gt;i-1),1))xlabel('Ratio Oligo-dT / (CUT + Oligo-dT)', 'color',[1 1 1]);ylabel('Number of clusters', 'color',[1 1 1]);title(strcat('n = ', num2str(i)), 'color',[1 1 1])set(gca, 'Xcolor', [1 1 1], 'Ycolor', [1 1 1])end</pre>
<p>et j&#8217;obtiens la figure suivante<br /><a href="http://bp2.blogger.com/_90Wu6Gs32-U/SCxLKCx4vkI/AAAAAAAAATg/0bW7T9OwB20/s1600-h/cluster_distribution_all_tag.png"><img style="cursor:pointer;" src="http://bp2.blogger.com/_90Wu6Gs32-U/SCxLKCx4vkI/AAAAAAAAATg/0bW7T9OwB20/s400/cluster_distribution_all_tag.png" alt="" border="0" /></a><br />on voit qu&#8217;il y a un nb plus important de cluster de la classe 1 que ceux de la classe 10<br />si on regarde le nb de tag, on constate aussi qu&#8217;il y a environ 20 % de plus de CUTSque d&#8217;Oligo-dT</p>
<p>On va donc chercher a réduire artificiellement le nb de CUT en en éliminant de façon aléatoire jusqu&#8217;à avoir le meme nombre<br />script : delete_rand_tag
<pre>h8 = header08;tag = find(h8);s = size(tag,1);while sum(h8) &gt; 49284p = floor(rand(1000,1) * s);ptag = tag(p);h8(ptag) = 0;end</pre>
<p>header_rand = header01 + h8;<br />header_rand(:,2) = header01;<br />je fais ensuite [header_region_rand] = segment(header_rand, dt, nt, chr_ref);<br />je renome ratio2_1_100_1 en ratio2_1_100_1_ rand<br />puis je représente les memes histogrammes
<pre>figurefor i=1:9subplot(3,3,i)hist(ratio2_1_100_1_rand(find(ratio2_1_100_1_rand(:,4)&gt;i-1),1))xlabel('Ratio Oligo-dT / (CUT + Oligo-dT)', 'color',[1 1 1]);ylabel('Number of clusters', 'color',[1 1 1]);title(strcat('n = ', num2str(i)), 'color',[1 1 1])set(gca, 'Xcolor', [1 1 1], 'Ycolor', [1 1 1])end</pre>
<p>et j&#8217;obtiens<br /><a href="http://bp3.blogger.com/_90Wu6Gs32-U/SCxLKSx4vlI/AAAAAAAAATo/GTTp079ME1c/s1600-h/cluster_distribution_same_tag_nb.png"><img style="cursor:pointer;" src="http://bp3.blogger.com/_90Wu6Gs32-U/SCxLKSx4vlI/AAAAAAAAATo/GTTp079ME1c/s400/cluster_distribution_same_tag_nb.png" alt="" border="0" /></a></p>
<p>on voit que c&#8217;est plus homogène entre les classes extrèmes.<br />pour vérifier cela, on cherche a voir si la répartition du nombre de tag dans les segment est la meme pour toute les classes.</p>
<p>j&#8217;extrait de la matrice ratio2_1_100_1_ rand les lignes pour lesquelles le ratio est faible (inf a 0.2 CUTs) et fort (sup à 0.8 WT) et je fait l&#8217;histogramme du nombre de tag (colonne 4). je choisi pour ces histogramme d&#8217;avaoir comme nombre de catégorie la valeur maximale de tag pour chaque type (3318 pour le WT et 1522 pour les CUTs.<br />puis je trace les courbe correspondantes en échelle log</p>
<p><code>h_0=hist(ratio2_1_100_1_rand(find(ratio2_1_100_1_rand(:,1)0.8),4), max(ratio2_1_100_1_rand(find(ratio2_1_100_1_rand(:,1)&gt;0.8),4)));<br />figure;<br />plot(h_0,'r');<br />hold on<br />plot(h_1,'g');</code></p>
<p><a href="http://bp0.blogger.com/_90Wu6Gs32-U/SC29XSx4vmI/AAAAAAAAATw/l4QXeQGqToU/s1600-h/repartition_of_tag_per_cluster.png"><img style="cursor:pointer;" src="http://bp0.blogger.com/_90Wu6Gs32-U/SC29XSx4vmI/AAAAAAAAATw/l4QXeQGqToU/s400/repartition_of_tag_per_cluster.png" alt="" border="0" /></a><br />on voit que les segments avec un faible nb de tag sont plus nombreux pour les CUTs. cependant a partir de 4 tags par segment on observe la meme répartition.<br />on peut donc dire que a partir de 4 tags par segment on a un nombre similaire de segments avec le meme nombre de tag dans ceux-ci.</p>
<p>Je me suis rendu compte que les position des tags sont fausses. en fait elles sont décalée par rapport a ce qu&#8217;on veux car on s&#8217;interresse a la fin des tag et non au début<br />j&#8217;ai fait un programme qui corrige ca (<span class="script">tag_position_correction</span>)<br />je corrige donc les 2 matrice contenant les résultats des WT et CUTs
<pre>chr_WT=tag_position_correction(header01,chr_len);chr_CUTs=tag_position_correction(h8,chr_len);chr_WT_CUTs = chr_WT + chr_CUTs;chr_WT_CUTs(:,2)=chr_WT;[regionWT_CUTs] = segment(chr_WT_CUTs, dt, nt, chr_ref);

cpt =

       12021</pre>
<p>et je récupère la matrice segments_WT_CUTs<br />je vais maintenant rechercher le max de densité de chaque segment<br />je calcul d&#8217;abord la matrice de densité pour les tag WT et CUts<br /><code>density_WT_CUTs = densite_sage(chr_WT_CUTs(:,1), 100);</code><br />puis je cherche le max de densité<br /><code>segments_WT_CUTs=find_max_segment(density_WT_CUTs, segments_WT_CUTs);</code><br />j&#8217;exporte avec <code>save(strcat('segments_WT_CUTs','.mat.csv'),'segments_WT_CUTs', '-ascii','-tabs');</code></p>
<p>TODO -&gt; export sur douanierousseau, localiser les segment par rapport aux orf et faire les graph</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/85/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/85/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=85&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/05/15/15-mai-2008-analyse-des-resultat-de-sage-restriction-wt-et-double-mutant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp2.blogger.com/_90Wu6Gs32-U/SCxLKCx4vkI/AAAAAAAAATg/0bW7T9OwB20/s400/cluster_distribution_all_tag.png" medium="image" />

		<media:content url="http://bp3.blogger.com/_90Wu6Gs32-U/SCxLKSx4vlI/AAAAAAAAATo/GTTp079ME1c/s400/cluster_distribution_same_tag_nb.png" medium="image" />

		<media:content url="http://bp0.blogger.com/_90Wu6Gs32-U/SC29XSx4vmI/AAAAAAAAATw/l4QXeQGqToU/s400/repartition_of_tag_per_cluster.png" medium="image" />
	</item>
		<item>
		<title>29 avril 2008 &#8211; interface sganarrayl</title>
		<link>http://xtof78000.wordpress.com/2008/04/29/29-avril-2008-interface-sganarrayl/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/29/29-avril-2008-interface-sganarrayl/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 09:27:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[gal]]></category>
		<category><![CDATA[gff]]></category>
		<category><![CDATA[pygresql]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[SganArrayL]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/29/29-avril-2008-interface-sganarrayl/</guid>
		<description><![CDATA[11h24 :Pour faire l&#8217;interface d&#8217;ajout du fichier gal, j&#8217;ai voulu reprendre celle d&#8217;ajout du fichier gff.celle-ci étant assez moyenne, j&#8217;ai donc décidé de la reprendre.pour que ce soit cohérent avec l&#8217;interface finale de sganarrayl, il faut deja pensé a l&#8217;intégralité de l&#8217;interface.Depuis la page d&#8217;accueil pour ajouter des puce, on pourra donc voir la liste [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=83&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">11h24</span> :<br />Pour faire l&#8217;interface d&#8217;ajout du fichier gal, j&#8217;ai voulu reprendre celle d&#8217;ajout du fichier gff.<br />celle-ci étant assez moyenne, j&#8217;ai donc décidé de la reprendre.<br />pour que ce soit cohérent avec l&#8217;interface finale de sganarrayl, il faut deja pensé a l&#8217;intégralité de l&#8217;interface.<br />Depuis la page d&#8217;accueil pour ajouter des puce, on pourra donc voir la liste des puces disponibles et aussi du fichier de définition des features utilisé.<br />on pourra depuis cette page aussi ajouter de nouveaux fichiers de puce et de feature.<br />l&#8217;ajout de feature va renvoyer sur la page add_gff.php<br />cette page propose un champ browse pour parcourir le disque local et ajouter un fichier.<br />l&#8217;envoie du formulaire va renvoyer sur la meme page.<br />cette fois ci, comme il y a un fichier uploader, ca va déclencher le script php.<br />celui-ci copie le fichier uploadé dans un répertoire spécifique.<br />il va aussi modifier la page pour faire apparaitre le nom du fichier traité et faire disparaitre le champs browse.<br />la page va aussi avoir un script javascript (add_gff.js).<br />celui-ci va se déclencher s&#8217;il y a un nom de fichier a traiter.<br />dans ce cas il va faire appelle au script add_gff.py pour traiter le fichier gff et renvoyer la réponse qui correspond au traitement et l&#8217;afficher.<br />add_gff.py parse le fichier gff à l&#8217;aide des du parser gff de parser_tools puis utilise la classe garden_state du module sganarrayl_interface pour se connecter à la base luce_la_puce et ajouter les feature par la méthode add_feature_data.</p>
<p>add_gff.py renvoie un fichier xml avec les balises ou  selon le déroulement du code.<br />le script javascript va interpréter ce xml et afficher les messages correspondants dans une balise prévue a cette effet et ingénieusement intitulée gff<br />voici le flux de données</p>
<p><a href="http://bp1.blogger.com/_90Wu6Gs32-U/SBhFbV7C2PI/AAAAAAAAATY/AkRZJLlNcmI/s1600-h/flux_donnees_gff.gif"><img style="cursor:pointer;" src="http://bp1.blogger.com/_90Wu6Gs32-U/SBhFbV7C2PI/AAAAAAAAATY/AkRZJLlNcmI/s400/flux_donnees_gff.gif" alt="" border="0" /></a><br />L&#8217;interface pour le fichier gff fonctionne bien maintenant et le code est propre.<br />passons au fichier gal</p>
<p>déroulement de la séquence.<br />l&#8217;utilisateur doit ajouter une puce dans la base.<br />il va alors aller sur la page add_gal.php.<br />il n&#8217;y a que 2 champs pour le moment.<br />le premier pour donner un nom à la puce.<br />le 2eme pour mettre le fichier gal qui contiendra les info sur les spots.<br />le nom de la puce sera celui utilisé par la suite pour faire référence à celle-ci.<br />le script va ensuite ajouter le nom de la puce dans la table array_chip_types s&#8217;il n&#8217;existe pas encore. s&#8217;il existe deja, l&#8217;ajout de la puce est refusé. par la suite il devra permettre la mise a jour de la puce.<br />ensuite il faut parcourir chaque spot, déterminer son type, vérifier dans la table array_spot_type si le type existe et sinon l&#8217;ajouter. on recherche ensuite dans les features de la table bank_orf qui ont la meme annotation que le spot.<br />si on trouve on garde la ref de la feature, sinon, la ref est nulle. on ajoute ensuite les info du spot dans la table array_spots, en ajoutant les liaisons vers les tables array_chip_types array_spot_type  et bank_orf.</p>
<p>todo -&gt; modifier sganarrayl_interface pour pouvoir sélectionner les id des orf ayant l&#8217;annotation du spot</p>
<p></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/83/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/83/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=83&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/29/29-avril-2008-interface-sganarrayl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp1.blogger.com/_90Wu6Gs32-U/SBhFbV7C2PI/AAAAAAAAATY/AkRZJLlNcmI/s400/flux_donnees_gff.gif" medium="image" />
	</item>
		<item>
		<title>17 avril 2008 &#8211; génération des tables pour le fichier gal</title>
		<link>http://xtof78000.wordpress.com/2008/04/17/17-avril-2008-generation-des-tables-pour-le-fichier-gal/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/17/17-avril-2008-generation-des-tables-pour-le-fichier-gal/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 15:23:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/17/17-avril-2008-generation-des-tables-pour-le-fichier-gal/</guid>
		<description><![CDATA[17h34les table reprennant les infos de la puce sontarray_chip_typearray_spotarray_spot_typearray_chip_type pourrait a mon avis contenir plus de choses. en gros toutes les infos globales sur une puces.array_spot rassemble les infos liées aux spot de la puceet array_spot_type regroupe les différents types de spots, pour l&#8217;instant je pense feature, control ou empty. le type de la puce [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=82&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">17h34</span><br />les table reprennant les infos de la puce sont<br />array_chip_type<br />array_spot<br />array_spot_type<br /><a href="http://bp0.blogger.com/_90Wu6Gs32-U/SAdvkc-KWzI/AAAAAAAAAS4/JbdL3xto4q8/s1600-h/array.png"><img style="cursor:pointer;" src="http://bp0.blogger.com/_90Wu6Gs32-U/SAdvkc-KWzI/AAAAAAAAAS4/JbdL3xto4q8/s400/array.png" alt="" border="0" /></a><br />array_chip_type pourrait a mon avis contenir plus de choses. en gros toutes les infos globales sur une puces.<br />array_spot rassemble les infos liées aux spot de la puce<br />et array_spot_type regroupe les différents types de spots, pour l&#8217;instant je pense feature, control ou empty.</p>
<p>le type de la puce est SLRI-Yeast-Barcode-13k<br />les infos sont dans  barcode12k_v2final.gal<br />comment doit se dérouler le programme :<br />1- récupérer le nom de la puce (et plus tard toute sa description)<br />2- ajouter ce nom dans le fichier array_chip_type<br />3- récupérer le fichier gal<br />4- le parser et pour chaque ligne<br />5- extraire le type (feature, spotting buffer ou empty)<br />6- ajouter le type dans la table s&#8217;il n&#8217;existe pas<br />7- extraite l&#8217;ID<br />8- eliminer les element en trop de l&#8217;ID<br />9- rechercher dans la base des feature si la feature existe et récupérer sont identifiant<br />10-ajouter ensuite la ligne dans array_spot en la liant au type de la puce, au type de spot qui va bien et à la feature qui va bien.</p>
<p>en reprennant le code pour introduire les données de features (<a href="http://gim-bioinfo.blogspot.com/2008/03/7-mars-2008-interface-pour-lajout-des.html">ici</a>) je me rend compte que le code est assez moyen, et surtout pas adapté a l&#8217;utilisation dans un cgi.<br />de plus il n&#8217;utilise pas le nouveau parser que j&#8217;ai créé.<br />donc je reprends tout, enfin en partie.</p>
<p>imaginons la structure de l&#8217;interface.<br />le plus simple, une page web avec un champ parcourir pour aller chercher le gff et un bouton valider<br />ca envoie la requete sur une page qui va traiter la requete.<br />cette page va récuperer le fichier et l&#8217;enregistrer dans un répertoire temporaire.<br />puis un objet loader va le tester pour savoir s&#8217;il existe bien, et ouvrir le filehandle<br />puis il va etre transmis au parser qui va vérifier le format (rajouter la fonction check dans le parser) et puis traiter toutes les données.<br />il faut ensuite une fonction pour ajouter ces données dans la base<br />il me faut alors une classe pour effectuer cette action.<br />ca va etre finalement une classe d&#8217;interface avec luce_la_puce.<br />cette classe pourrait s&#8217;appeler Garden_state qui traitera par une méthode appropriée l&#8217;objet de feature.<br />il me faut donc un loader.<br />c&#8217;est assez simple, le loader doit récupérer un nom de fichier<br />vérifier qu&#8217;il existye et l&#8217;ouvrir<br />récupérer le parser qui va le traiter<br />appliquer ce parser et renvoyer l&#8217;objet créér
<pre>class file_loader():

    def __init__(self, **arg):        filename = arg.get('filename', '')        try :            self.fhin = self._open_file(filename)        except IOError, e :            raise

    def _open_file(self, filename):        '''        fhin = x._open_file(filename)        filename -&gt; str        fhin -&gt; file        open a file and return the filehandle        '''        #test id the file exists and is a file        if not isfile(filename) :            raise IOError, "file %s doesn't exist" % filename        #test if reading access is granted        if not access(filename, R_OK) :            raise IOError, "permission denied for file %s" % filename        return open(filename, 'r')

    def get_filehandle(self):        try :            return self.fhin        except AttributeError :            return None

    def apply_parser(self, parser=None):        try :            if not parser:                parser = self.parser        except AttributeError :            raise

        return parser(file=self.fhin)

    def set_parser(self, parser=None):        self.parser = parser</pre>
<p>peut-etre aussi faut&#8217;il rajouter le moyen de réouvrir le file handle et puis par la suite une méthode pour copier le fichier dans un autre emplacement.<br />ensuite il faut donc que je créé l&#8217;interface pour luce_la_puce Garden_state</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/82/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/82/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=82&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/17/17-avril-2008-generation-des-tables-pour-le-fichier-gal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp0.blogger.com/_90Wu6Gs32-U/SAdvkc-KWzI/AAAAAAAAAS4/JbdL3xto4q8/s400/array.png" medium="image" />
	</item>
		<item>
		<title>15 avril 2008 &#8211; Parser pour le fichier gff</title>
		<link>http://xtof78000.wordpress.com/2008/04/16/15-avril-2008-parser-pour-le-fichier-gff/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/16/15-avril-2008-parser-pour-le-fichier-gff/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 13:38:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[gff]]></category>
		<category><![CDATA[parser]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/16/15-avril-2008-parser-pour-le-fichier-gff/</guid>
		<description><![CDATA[le parser pour fichier GFF est assez simpledescription du format gff &#8211;&#62; ici un header de taille variable marqué par &#8220;#&#8221;puis des données en colonne séparées par des tabulations.il y a 9 colonnes.il n&#8217;y a pas de ligne de titreexemple : less /home/gim2/bank/saccharomyces_cerevisiae.gff ##gff-version 3#date Wed Jul 18 19:35:09 2007## Saccharomyces cerevisiae S288C genome## Features [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=81&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>le parser pour fichier GFF est assez simple<br />description du format gff &#8211;&gt; <a href="http://www.sanger.ac.uk/Software/formats/GFF/GFF_Spec.shtml">ici</a></p>
<p>un header de taille variable marqué par &#8220;#&#8221;<br />puis des données en colonne séparées par des tabulations.<br />il y a 9 colonnes.<br />il n&#8217;y a pas de ligne de titre<br />exemple :
<pre>less /home/gim2/bank/saccharomyces_cerevisiae.gff</pre>
<p>
<pre>##gff-version 3#date Wed Jul 18 19:35:09 2007## Saccharomyces cerevisiae S288C genome## Features from the 16 nuclear chromosomes labeled chrI to chrXVI,# plus the mitochondrial genome labeled chrMito and the 2-micron plasmid.## Created by Saccharomyces Genome Database (http://www.yeastgenome.org/)## Weekly updates of this file are available via Anonymous FTP from:# ftp://ftp.yeastgenome.org/yeast/data_download/chromosomal_feature/saccharomyces_cerevisiae.gff## Please send comments and suggestions to yeast-curator@yeastgenome.org## SGD is funded as a National Human Genome Research Institute Biomedical Informatics Resource from# the U. S. National Institutes of Health to Stanford University.  The staff of SGD is listed at:# http://www.yeastgenome.org/SGD-staff.html#chrI    SGD     chromosome      1       230208  .       .       .       ID=chrI;dbxref=NCBI:NC_001133chrI    SGD     repeat_family   1       62      .       -       .       ID=TEL01L-TR;Name=TEL01L-TR;Note=Terminal%20stretch%20of%20telomeric%20repeats%20on%20the%20left%20arm%20of%20Chromosome%20I;dbxref=SGD:S000028864</pre>
<p>le contenu des colonnes est (dans l&#8217;ordre) :
<ul>
<li>seqname</li>
</ul>
<p>Le nom de la séquences, dans le cas de la levure, le chromosome
<ul>
<li>source</li>
</ul>
<p>La source de la feature.  soit le programme ayant réalisé la prédiction, ou la base de donnée publique&#8230; dans le cas de la levure, c&#8217;est en général SGD.
<ul>
<li>feature</li>
</ul>
<p>Le nom de la feature si possible un nom standardisé.
<ul>
<li>start, end</li>
</ul>
<p>debut et fin de la feature, fin doit etre supérieur a debut
<ul>
<li>score</li>
</ul>
<p>score de la feature ou &#8216;.&#8217; s&#8217;il n&#8217;y en a pas
<ul>
<li>strand</li>
</ul>
<p>&#8216;+&#8217; ou &#8216;-&#8217; selon le brin ou alors &#8216;.&#8217; si ca ne s&#8217;applique pas
<ul>
<li>frame</li>
</ul>
<p>&#8217;0&#8242;, &#8217;1&#8242;, &#8217;2&#8242;, ou &#8216;.&#8217; indique la position du premier codon
<ul>
<li>Attribute</li>
</ul>
<p>Cette colonne est différente car elle contient nom pas une valeur mais une liste d&#8217;attribut. ceux-ci sont séparé par des &#8220;;&#8221; et</p>
<p>Le fichier peut contenir des meta données identifées par un &#8220;#&#8221;</p>
<p>le parser doit donc<br />parser le header par la méthode par défaut<br />utiliser une liste de nom de colonne prédéfinie<br />parser les lignes<br />puis pour chaque item parser l&#8217;élément de la dernière colonne pour en extraire les attributs et les ajouter a item.
<pre>class Gff_parser(Items):    def __init__(self, **arg):        '''        x = Gff_parser(**arg)        '''

        arg['column_names']=['chr','origin','type','start','end','score','strand','frame', 'group']

        self.attr_group=set([])        #call the init method of Items        Items.__init__(self, **arg)        self.attr_list.extend(self.attr_group)

    def parse_group(self, item):        group = item.get_attribute('group')

        groups = split(group, ';')

        group_items=(self.parse_group_item(item) for item in groups)

        item.set_attribute(group_items)

        self.attr_group.update(item.get_attr_list())

        return item

    def special_data_parsing_fn(self, item):        return self.parse_group(item)

    def parse_group_item(self, group_item):        return split(group_item, '=')</pre>
<p>j&#8217;ai modifié la méthode d&#8217;assignation des item.<br />j&#8217;ai rajouté une fonction qui s&#8217;applique sur chaque item juste après sa création.<br />cette méthode sera a surclasser dans les parser si besoin
<pre>    def list2item(self, data_list):        '''        data_item = x.list2item(data_list)        data_list -&gt; list of list        data_item -&gt; list        create instances of Item for all element of data_list        return all instances in a list        '''        try :            #create instance of Item for all element of data_list            return (self.special_data_parsing_fn(Item(x, self.attr_list)) for x in data_list)        except TypeError :            #if data_list can't be map, return an ampty list            return []

    def special_data_parsing_fn(self, item):        return item</pre>
<p>j&#8217;ai ajouté un module de test gff qui reste a completer.
<pre>    def test_gff_parser(self):        test_gff = Gff_parser(file_arg = '/home/gim2/bank//saccharomyces_cerevisiae.gff')        self.assert_(isinstance(test_gff,Gff_parser))        print test_gff[0].keys()</pre>
<p>j&#8217;ai en sortie
<pre>tmp_file format is not correct..col_0 is not a valide attribute....the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 8 tests in 4.603s

OK</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/81/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/81/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=81&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/16/15-avril-2008-parser-pour-le-fichier-gff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>
	</item>
		<item>
		<title>15 avril 2008 &#8211; Parser pour le fichier gal</title>
		<link>http://xtof78000.wordpress.com/2008/04/15/15-avril-2008-parser-pour-le-fichier-gal/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/15/15-avril-2008-parser-pour-le-fichier-gal/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 09:06:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[gal]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[SganArrayL]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/15/15-avril-2008-parser-pour-le-fichier-gal/</guid>
		<description><![CDATA[11h04maintenant que le parser global est construit, je vais faire un parser pour le fichier gal dérivé de celui-ciFormat d&#8217;un fichier GAL -&#62; GenePix Array Listexemple du fichier /home/gim2/bioinfo/microarray/barcode12k_v2final.galla commandeless /home/gim2/bioinfo/microarray/barcode12k_v2final.galdonneATF 151 6Type=GenePix ArrayList V1.0BlockCount=48BlockType=0"Block1= 3530, 8000, 120, 24, 180, 24, 180""Block2= 8030, 8000, 120, 24, 180, 24, 180""Block3= 12530, 8000, 120, 24, 180, 24, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=80&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">11h04</span><br />maintenant que le parser global est construit, je vais faire un parser pour le fichier gal dérivé de celui-ci<br />Format d&#8217;un fichier GAL -&gt; <a href="http://lims.clondiag.com/pionir/help/robo/o.ABSTRACT_ARRAY.importGALdesc.html">GenePix Array List</a><br />exemple du fichier <code>/home/gim2/bioinfo/microarray/barcode12k_v2final.gal</code><br />la commande<br /><code>less /home/gim2/bioinfo/microarray/barcode12k_v2final.gal</code><br />donne<br /><code>ATF     1<br />51      6<br />Type=GenePix ArrayList V1.0<br />BlockCount=48<br />BlockType=0<br />"Block1=        3530, 8000, 120, 24, 180, 24, 180"<br />"Block2=        8030, 8000, 120, 24, 180, 24, 180"<br />"Block3=        12530, 8000, 120, 24, 180, 24, 180"<br />"Block4=        17030, 8000, 120, 24, 180, 24, 180"<br />"Block5=        3530, 12500, 120, 24, 180, 24, 180"<br />"Block6=        8030, 12500, 120, 24, 180, 24, 180"<br />"Block7=        12530, 12500, 120, 24, 180, 24, 180"<br />"Block8=        17030, 12500, 120, 24, 180, 24, 180"<br />"Block9=        3530, 17000, 120, 24, 180, 24, 180"<br />"Block10=       8030, 17000, 120, 24, 180, 24, 180"<br />"Block11=       12530, 17000, 120, 24, 180, 24, 180"<br />"Block12=       17030, 17000, 120, 24, 180, 24, 180"<br />"Block13=       3530, 21500, 120, 24, 180, 24, 180"<br />"Block14=       8030, 21500, 120, 24, 180, 24, 180"<br />"Block15=       12530, 21500, 120, 24, 180, 24, 180"<br />"Block16=       17030, 21500, 120, 24, 180, 24, 180"<br />"Block17=       3530, 26000, 120, 24, 180, 24, 180"<br />"Block18=       8030, 26000, 120, 24, 180, 24, 180"<br />"Block19=       12530, 26000, 120, 24, 180, 24, 180"<br />"Block20=       17030, 26000, 120, 24, 180, 24, 180"<br />"Block21=       3530, 30500, 120, 24, 180, 24, 180"<br />"Block22=       8030, 30500, 120, 24, 180, 24, 180"<br />"Block23=       12530, 30500, 120, 24, 180, 24, 180"<br />"Block24=       17030, 30500, 120, 24, 180, 24, 180"<br />"Block25=       3530, 35000, 120, 24, 180, 24, 180"<br />"Block26=       8030, 35000, 120, 24, 180, 24, 180"<br />"Block27=       12530, 35000, 120, 24, 180, 24, 180"<br />"Block28=       17030, 35000, 120, 24, 180, 24, 180"<br />"Block29=       3530, 39500, 120, 24, 180, 24, 180"<br />"Block30=       8030, 39500, 120, 24, 180, 24, 180"<br />"Block31=       12530, 39500, 120, 24, 180, 24, 180"<br />"Block32=       17030, 39500, 120, 24, 180, 24, 180"<br />"Block33=       3530, 44000, 120, 24, 180, 24, 180"<br />"Block34=       8030, 44000, 120, 24, 180, 24, 180"<br />"Block35=       12530, 44000, 120, 24, 180, 24, 180"<br />"Block36=       17030, 44000, 120, 24, 180, 24, 180"<br />"Block37=       3530, 48500, 120, 24, 180, 24, 180"<br />"Block38=       8030, 48500, 120, 24, 180, 24, 180"<br />"Block39=       12530, 48500, 120, 24, 180, 24, 180"<br />"Block40=       17030, 48500, 120, 24, 180, 24, 180"<br />"Block41=       3530, 53000, 120, 24, 180, 24, 180"<br />"Block42=       8030, 53000, 120, 24, 180, 24, 180"<br />"Block43=       12530, 53000, 120, 24, 180, 24, 180"<br />"Block44=       17030, 53000, 120, 24, 180, 24, 180"                        <br />"Block45=       3530, 57500, 120, 24, 180, 24, 180"                         <br />"Block46=       8030, 57500, 120, 24, 180, 24, 180"                         <br />"Block47=       12530, 57500, 120, 24, 180, 24, 180"                        <br />"Block48=       17030, 57500, 120, 24, 180, 24, 180"                        <br />Block   Column  Row     ID      Name    Sequence<br />1       1       1       YHR185C-D-R     PFS1    AGAGATCCACTTCCCATAATT<br />1       2       1       YHR185C-D-R     PFS1    AGAGATCCACTTCCCATAATT<br />1       3       1       YIR043C-D               CTGCACATTCGATTACAGCG<br />1       4       1       YIR043C-D               CTGCACATTCGATTACAGCG<br />1       5       1       YHR067W-D       RMD12   TTATGCACCGTGACGAGGCT<br />1       6       1       YHR067W-D       RMD12   TTATGCACCGTGACGAGGCT<br />1       7       1       YBR296C-U       PHO89   CACGACCGACAATATGGTGA<br />1       8       1       YBR296C-U       PHO89   CACGACCGACAATATGGTGA<br />1       9       1       YOL076W-U       MDM2    ACGGATGGATCAGTTGCTAT<br />1       10      1       YOL076W-U       MDM2    ACGGATGGATCAGTTGCTAT<br />1       11      1       YNL204C-U       SPS18   GCGCTGGCACAAGAATACCA<br />1       12      1       YNL204C-U       SPS18   GCGCTGGCACAAGAATACCA<br />1       13      1       YLR205C-U       HMX1    AACTGAACATACCCGGTGAC<br />1       14      1       YLR205C-U       HMX1    AACTGAACATACCCGGTGAC<br />1       15      1       YJL039C-D       NUP192  TTGAGCCCGATCAGTCGATG<br />1       16      1       YJL039C-D       NUP192  TTGAGCCCGATCAGTCGATG<br />1       17      1       YGR029W-D       ERV1    TTACGTCCCGGATGCCGTTT<br />1       18      1       YGR029W-D       ERV1    TTACGTCCCGGATGCCGTTT<br />1       19      1       YEL072W-D       RMD6    TGCAGCACGCAAGACCATGA<br />1       20      1       YEL072W-D       RMD6    TGCAGCACGCAAGACCATGA<br />1       21      1       YDR022C-D       CIS1    GGTCGATAATAACACGCCAC<br />1       22      1       YDR022C-D       CIS1    GGTCGATAATAACACGCCAC<br />1       23      1       YBL086C-U               ACCACTCACTAAGGAGGATC<br />1       24      1       YBL086C-U               ACCACTCACTAAGGAGGATC<br />1       1       2       YLR327C-D-R             GATAACGACTCAGTGC<br />1       2       2       YLR327C-D-R             GATAACGACTCAGTGC<br />1       3       2       YIL033C-D       BCY1    GGATATTAGCCATCTACGTG<br /></code></p>
<p>description des différentes parties<br />le fichier est spéraré en 3 parties<br />les 2 première ligne donne des info sur la structure du fichier<br />il y a ensuite le header du fichier<br />puis les données<br />1ere ligne -&gt; ATF : conforme au format Axon Text File<br />             1 : version du format<br />2eme ligne -&gt; 51 : nombre de ligne dans le header<br />               6 : nombre de colonne dans les données<br />3éme à 53 ème ligne -&gt;header<br />Type=GenePix ArrayList V1.0 -&gt; type du fichier<br />BlockCount=48 -&gt; nombre de block<br />BlockType=0 -&gt;Type de block decrit :<br />0 = rectangulaire.<br />1 = orange-packing #1.<br />2 = orange-packing #2.<br />&#8220;Block1=        3530, 8000, 120, 24, 180, 24, 180&#8243; -&gt;position et dimension de chaque block<br />xOrigin : position x du centre de la feature la plus en haut a gauche<br />yOrigin : position y du centre de la feature la plus en haut a gauche<br />FeatureDiameter : Diamètre des features du block<br />xFeature : Nombre de colonnes de features dans le block<br />xSpacing : espacement des colonnes<br />yFeature : Nombre de lignes de features dans le block<br />ySpacing : espacement des lignes<br />54eme ligne -&gt; ligne de titre des colonnes<br />55eme ligne a la fin -&gt; information pour chaque features</p>
<p>Le parser doit donc spécifiquement<br />lire la première ligne et stocker le format de fichier et sa valeur<br />lire la 2eme ligne et stocker le nb de ligne de header et le nb de colonne (pas vraimenet utile)<br />lire toute les ligne du header, les parser pour séparer la clé des données<br />(possible de rajouter un mini parser pour les données de block)<br />puis lire les données.<br />je vais donc faire un parser héritant de la classe Items.<br />je vais surclasser parse_header pour traiter les 1ere ligne et le header<br />puis parser le rester par les méthodes de Items.</p>
<p>le code du parser
<pre>

class Gal_parser(Items):'''Gal_parserparser for *.gal filesx = Gal_parser(**arg)options :file_arg -&gt; file path or file handleitem_list -&gt; list of item instances

'''

def __init__(self, **arg):'''x = Gal_parser(**arg)'''#call the init method of ItemsItems.__init__(self, **arg)

def parse_header(self, fhin):'''x.parse_header(fhin)fhin -&gt; fileparse the header of the file.

'''#get the format of the file (1st line of the file)file_format = fhin.readline()#check if it's a ATF fileif not "ATF" in file_format :    raise FormatError("%s format is not correct" % fhin.name)#store the file_format dataself.file_format=split(file_format, '\t')

#get the file structure data (2nd line of the file)try :    self.nb_header_rows, self.nb_cols=split(fhin.readline(), '\t')except ValueError :    self.nb_header_rows = fhin.readline()

self.nb_header_rows = int(self.nb_header_rows)

#create the structure for the headerself.header={}#get all the header lines and parse themfor i in range(self.nb_header_rows) :    try :        k,v = self.parse_header_line(fhin.readline())    except AttributeError :        continue    except ValueError :        continue    self.header[k] = v#set the parse_header flag to true, so it won't be parsed again laterself.flag['parse_header'] = True

def parse_header_line(self, line):'''k,v = x.parse_header_line(line)clean the line and split the key and the value'''#cleaning of the linetry :    #remove backspace    line = remove_end_line(line)    #remove "    line=replace(line,'"', '')    #remove tab    line=replace(line,'\t', '')

except AttributeError :    print "no replace for %s" % line    raise#split the line with the field separator =#and return the resulting tuple ok key/valuetry :    return split(line,"=")except ValueError :    print "no = in %s" % line    raise

def get_header(self, *arg):'''header = x.get_header(*arg)return the header dictionnaryarg -&gt;    keys : return keys of header    values : return values of header    items : return tuple ok key/value of header'''#check the arg optionif 'keys' in arg : return self.header.keys()if 'values' in arg : return self.header.values()if 'items' in arg : return self.header.items()#if no optionreturn self.header

class FormatError(exceptions.Exception):def __init__(self, msg=''):self.errmsg = msg

def __str__(self):return self.errmsg</pre>
<p>j&#8217;ai ajouté un classe FormatError pour gérer les erreur de format de fichier.<br />j&#8217;ai modifié la fonction de test
<pre>def test_gal_parser(self):'''test si l'heritage fonctionne bien'''file_format="ATF"file_format_version = 1header_row_nb = 2data_col_nb = 3header_key_1 = "key1"header_val_1 = "val1"header_key_2 = "key2"header_val_2 = "val2"col_1 = "col_1"col_2 = "col_2"col_3 = "col_3"data_l1_c1 = "data_l1_c1"data_l1_c2 = "data_l1_c2"data_l2_c1 = "data_l2_c1"data_l2_c2 = "data_l2_c2"data_l2_c3 = "data_c3"data_l1_c3 = "data_c3"test_file='''%s\t%s%s\t%s%s=%s"%s=%s"%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (file_format, file_format_version,header_row_nb, data_col_nb,header_key_1, header_val_1,header_key_2, header_val_2,col_1, col_2, col_3,data_l1_c1, data_l1_c2, data_l1_c3,data_l2_c1, data_l2_c2, data_l2_c3)self.write_tmp_file(filetext = test_file)test_gal = Gal_parser(file_arg = 'tmp_file')self.assert_(isinstance(test_gal,Gal_parser))self.assert_(len(test_gal.get_header())==2)

self.assert_(test_gal.get_header('keys')==[header_key_2, header_key_1])self.assert_(test_gal.get_header('values')==[header_val_2, header_val_1])self.assert_(len(test_gal)==2)self.assert_(test_gal[0].get_attribute(col_1)==data_l1_c1)

file_format="ATG"test_file='''%s\t%s%s\t%s%s=%s"%s=%s"%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (file_format, file_format_version,header_row_nb, data_col_nb,header_key_1, header_val_1,header_key_2, header_val_2,col_1, col_2, col_3,data_l1_c1, data_l1_c2, data_l1_c3,data_l2_c1, data_l2_c2, data_l2_c3)self.write_tmp_file(filetext = test_file)self.assertRaises(FormatError, Gal_parser, filename = 'tmp_file')

remove('tmp_file')

test_gal = Gal_parser(file_arg = '/home/gim2/bioinfo/microarray/barcode12k_v2final.gal');self.assert_(isinstance(test_gal,Gal_parser))self.assert_(len(test_gal.get_header())==51)</pre>
<p>et le test me renvoie
<pre>tmp_file format is not correct.col_0 is not a valide attribute....the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 7 tests in 2.844s

OK</pre>
<p>j&#8217;ai donc un parser de fichier gal qui fonctionne bien.<br />quel est le but de tout ca ?<br />l&#8217;idée est de parser le fichier de description de la puce et de mettre les infos dans la base de donnée. je cherche également a liéer les spot aux orf du genome de la levure.<br />j&#8217;ai précédemment examiné le fichier gal et d&#8217;autre fichiers décrivant les puces (<a href="http://gim-bioinfo.blogspot.com/2008/03/12-mars-2008-recupration-des.html">12 mars</a>, <a href="http://gim-bioinfo.blogspot.com/2008/03/13-mars-2008-association-des-tag-des.html">13 mars (1)</a> et <a href="http://gim-bioinfo.blogspot.com/2008/03/13-mars-2008-identification-des-tags-du.html">13 mars (2)</a><br />l&#8217;analyse de ces fichier a permis de constater que l&#8217;annotation de certain spot ne coorespond plus a une orf existante. mais que cette ancienne annotation est généralement toujours présente dans les alias des orf.<br />l&#8217;analyse plus fine de cela a meme permis de déterminer que seule 7 annotations avaient réellement totalement disparues.<br /><code>YAR037W </code><code>YAR040C </code><code>YAR043C </code><code>YCL006C </code><code>YCL013W YCL026C </code><code>YCL053C</code><br />ce qui correspond a 30 spot au total<br /><code>grep YCL053C ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>1       23      19      YCL053C-U               CTATTGTTGAAATGCCGGGA<br />1       24      19      YCL053C-U               CTATTGTTGAAATGCCGGGA<br />39      23      20      YCL053C-D               CATAGTCGAGAACCGGAGAC<br />39      24      20      YCL053C-D               CATAGTCGAGAACCGGAGAC</code><br /><code>grep YAR043C ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>34      3       8       YAR043C-U               ATTCTAGCGGCAGATCCGTG<br />34      4       8       YAR043C-U               ATTCTAGCGGCAGATCCGTG</code><br /><code>grep YCL013W ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>13      23      22      YCL013W-D               CGCTCGAACATAATTGGGTA<br />13      24      22      YCL013W-D               CGCTCGAACATAATTGGGTA<br />25      23      22      YCL013W-U               CCTGTCAGTAAACCGAGAGA<br />25      24      22      YCL013W-U               CCTGTCAGTAAACCGAGAGA</code><br /><code>grep YCL026C ~/bioinfo/microarray/barcode12k_v2final.gal </code><br /><code>5       23      21      YCL026C-D               CCTCCGAACAGAGAGTCTTA<br />5       24      21      YCL026C-D               CCTCCGAACAGAGAGTCTTA<br />13      3       4       YCL026C-A-U     FRM2    GCTCACCGAACATCAGATTA<br />13      4       4       YCL026C-A-U     FRM2    GCTCACCGAACATCAGATTA<br />17      3       21      YCL026C-U-R             CCTCTGCTAAGTAGTAGA<br />17      4       21      YCL026C-U-R             CCTCTGCTAAGTAGTAGA<br />17      23      21      YCL026C-U               CCCTCTGCTAAAGTAGTAGA<br />17      24      21      YCL026C-U               CCCTCTGCTAAAGTAGTAGA<br />42      5       19      YCL026C-A-D     FRM2    GGCGGACTACAACACATTCA<br />42      6       19      YCL026C-A-D     FRM2    GGCGGACTACAACACATTCA</code><br /><code>grep YCL006C ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>23      23      23      YCL006C-D               CCCGCTAGTCAATAATCGTA<br />23      24      23      YCL006C-D               CCCGCTAGTCAATAATCGTA<br />29      5       15      YCL006C-D               CCCGCTAGTCAATAATCGTA<br />29      6       15      YCL006C-D               CCCGCTAGTCAATAATCGTA<br />35      23      23      YCL006C-U               CCTGAAGATAAATCCCGTCA<br />35      24      23      YCL006C-U               CCTGAAGATAAATCCCGTCA<br />41      5       15      YCL006C-U               CCTGAAGATAAATCCCGTCA<br />41      6       15      YCL006C-U               CCTGAAGATAAATCCCGTCA</code><br /><code>grep YAR040C ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>7       3       9       YAR040C-U               CCATCTCAGTGGGTGCAATG<br />7       4       9       YAR040C-U               CCATCTCAGTGGGTGCAATG</code><br /><code>grep YAR037W ~/bioinfo/microarray/barcode12k_v2final.gal</code><br /><code>23      3       9       YAR037W-U               AGCTAGACTATCGCCCAATG<br />23      4       9       YAR037W-U               AGCTAGACTATCGCCCAATG</code><br />a<br />l&#8217;ideal serait de faire cette identification lorsque j&#8217;ajoute le fichier gal dans la base.<br />si on suppose que la liste des orf est dans la base de donnée.<br />il faut donc extraire le nom des annotation des spot, retirer les caractère qui ont été ajouté pour les puc (U, D et R) en faire une liste d&#8217;occurences uniques et les rechercher dans la base de données.<br />je vais faire une premiere version mais en utilisant un fichier gff au lieu de de la base de donnée.<br />il faut deja récupéré les ID des spots.<br />pour ca j&#8217;utilise la méthode get_attr_list qui me renvoie la liste des valeur d&#8217;un attribut pour l&#8217;ensemble des items.<br />j&#8217;utilise ensuite un set pour stocker ces valeur, ainsi je n&#8217;ai que celles qui sont distincte.<br />j&#8217;utilise ensuite une expression régulière pour eliminer les -D, -U, et -R
<pre>def extract_annotation_id(annot_id):return re.sub(r'-[RUD]+[1-9]*','',annot_id)

def analyse_gal_file():gal_file = '/home/gim2/bioinfo/microarray/barcode12k_v2final.gal'gal = Gal_parser(file_arg = gal_file)id = gal.get_attr_list('ID')print "il y a %i ID de spot dans %s" % (len(id), gal_file)id_set = set(id)print "il y a %i ID distintes dans %s" % (len(id_set), gal_file)id=map(extract_annotation_id, id)id_set = set(id)print "il y a %i annotations d'orf dans %s" % (len(id_set), gal_file)</pre>
<p>j&#8217;obtiens
<pre>il y a 27648 ID de spot dans /home/gim2/bioinfo/microarray/barcode12k_v2final.galil y a 12677 ID distintes dans /home/gim2/bioinfo/microarray/barcode12k_v2final.galil y a 5920 annotations d'orf dans /home/gim2/bioinfo/microarray/barcode12k_v2final.gal</pre>
<p>j&#8217;arrive donc a récupérer les 5920 orf utilisée dans ces puces<br />il faut ensuite aller les comparer avec celles du fichiers gff<br />je refais donc un parser gff rapide (<a href="http://gim-bioinfo.blogspot.com/2008/04/15-avril-2008-parser-pour-le-fichier_16.html">ici</a>)</p>
<p>puis je sélectionne les id des orf<br /><code>gff_file = '/home/gim2/bank//saccharomyces_cerevisiae.gff'<br /> gff = Gff_parser(file_arg = gff_file)<br />id2 = gff.get_attr_list('ID')</code><br /><code>il y a 16316 ID dans /home/gim2/bank//saccharomyces_cerevisiae.gff</code><br />si je prends les tag name et gene en plus j&#8217;ai :<br /><code>id2 = gff.get_attr_list('ID') + gff.get_attr_list('Name') + gff.get_attr_list('gene')</code><br /><code>il y a 48948 ID, Name et gene dans /home/gim2/bank//saccharomyces_cerevisiae.gff</code><br />si j&#8217;utilise les set pour connaitre n&#8217;avoir que des valeurs distinctes j&#8217;ai :<br /><code>il y a 16316 ID dans /home/gim2/bank//saccharomyces_cerevisiae.gff<br />il y a 8098 ID distinctes dans /home/gim2/bank//saccharomyces_cerevisiae.gff<br />il y a 48948 ID, Name et gene dans /home/gim2/bank//saccharomyces_cerevisiae.gff<br />il y a 12879 ID, Name et gene distincts dans /home/gim2/bank//saccharomyces_cerevisiae.gff</code><br />j&#8217;ai besoin aussi des alias des orf car ce sont parfois les anciens noms de ces orfs
<pre>alias=gff.get_attr_list('Alias')  for x in alias :      if not x : continue      x=split(x,',')      id2 += x  print len(id2)  print 'il y a %i ID, Name, gene et alias dans %s' % (len(id2), gff_file)  id_set2 = set(id2)  print 'il y a %i ID, Name, gene et alias distincts dans %s' % (len(id_set2), gff_file)</pre>
<p>et j&#8217;obtiens
<pre>il y a 65786 ID, Name, gene et alias dans /home/gim2/bank//saccharomyces_cerevisiae.gffil y a 15774 ID, Name, gene et alias distincts dans /home/gim2/bank//saccharomyces_cerevisiae.gff</pre>
<p>je vais donc comparer les id du fichier gal et ceux du fichier gff en faisant une simple différence de set<br /><code>print "il y a %i ID presente dans %s qui sont absentes de %s" % (len(id_set2), gal_file, gff_file)<br />  print "ce sont les ID : ", id_set.difference(id_set2)</code>
<pre>il y a 15774 ID presentes dans /home/gim2/bioinfo/microarray/barcode12k_v2final.gal qui sont absentes de /home/gim2/bank/saccharomyces_cerevisiae.gffce sont les ID :  set(['YCL053C', 'YAR043C', 'Spotting Buffer', 'YCL013W', 'Empty', 'YCL026C', 'YCL006C', 'YAR040C', 'YAR037W'])</pre>
<p>Ca correspond a celles trouvées précédemment</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/80/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/80/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=80&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/15/15-avril-2008-parser-pour-le-fichier-gal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>
	</item>
		<item>
		<title>14 avril 2008 &#8211; ajout du module de conversion des données</title>
		<link>http://xtof78000.wordpress.com/2008/04/14/14-avril-2008-ajout-du-module-de-conversion-des-donnees/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/14/14-avril-2008-ajout-du-module-de-conversion-des-donnees/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 08:46:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[conversion]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[SganArrayL]]></category>
		<category><![CDATA[type]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/14/14-avril-2008-ajout-du-module-de-conversion-des-donnees/</guid>
		<description><![CDATA[10h48suite de la construction du parser global.pour mieux utiliser les données dans le parser, il est utile de les convertir au bon format.elles sont toutes reconnues comme texte.les seuls autres types pouvant exister pour des données sont integer ou float.il pourrait y avoir des booléens mais on va partir du principe qu&#8217;il n&#8217;y en a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=79&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">10h48</span><br />suite de la construction du parser global.<br />pour mieux utiliser les données dans le parser, il est utile de les convertir au bon format.<br />elles sont toutes reconnues comme texte.<br />les seuls autres types pouvant exister pour des données sont integer ou float.<br />il pourrait y avoir des booléens mais on va partir du principe qu&#8217;il n&#8217;y en a pas.<br />les types listes ou autre propres a python ne sont pas présents dans des fichiers de données.<br />la conversion des données est intéressante mais ralenti le parsing.<br />il me semble que malgré tout il y a un gain de temps par la suite<br />La conversion utilise la fonction try. qui permet e s&#8217;affranchir de pas mal de test qui sont réalisé par les fonction de conversion elle-meme. ces fonctions sont int et float.<br />code du convertisseur
<pre> def set_type(self, value):     '''     val = x.set_type(value)     value -&gt; str     val -&gt; str, int or float     convert the data to the correct data type     '''     #store the data into the return variable     val = value     #try converting     try :         #try first to convert into a float         val = float(value)         #if succeed, try to convert into an integer         val = int(value)     except ValueError:         #catch a converting error, either from float or int         pass     #return the stored value     return val</pre>
<p>et le code du test correspondant
<pre> def test_type_parsed_data(self):     '''     teste si le type des donnees parsees est correcte     '''     header_info_1 = "header_01"     header_info_2 = "header_02"     col_1 = "col_1"     col_2 = "col_2"     col_3 = "col_3"     data_l1_c1 = "texte"     data_l1_c2 = 1     data_l2_c1 = 1.5     data_l2_c2 = "1e+5"     test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(type(test_item[0].get_attribute(col_1)) == type(data_l1_c1))     self.assert_(type(test_item[0].get_attribute(col_2)) == type(data_l1_c2))     self.assert_(type(test_item[1].get_attribute(col_1)) == type(data_l2_c1))     self.assert_(type(test_item[1].get_attribute(col_2)) == type(float(data_l2_c2)))

     remove('tmp_file')</pre>
<p>ce qui donne en sortie de la fonction test
<pre>..the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 4 tests in 0.065s

OK</pre>
<p><span class="time">11h34</span><br />le parser est bien avancé. il lui manque quelques fonctions comme l&#8217;impression</p>
<p>c&#8217;est facile a ajouter. l&#8217;impression sera par defaut basique en utilisant les marker  et séparateur par défaut.<br />touts les attributs seront imprimé par défaut.<br />il sera cependant possible de spécifier ces paramètres
<pre>DANS Items def __str__(self, text_sep='', attr_list=[]):     '''     print x  x.__str__()     print the data in a text format, using default options

     '''     #if no text separator was specified, use the default one     if not text_sep : text_sep = self.text_sep     #if no attribute list was specified, use the default one if exist or nothing     if not attr_list :         try :             attr_list = self.attr_list         except AttributeError :             pass     #if header exist add the header_mark at the top of the each line     #and add all lines into the text to print     try :         text_list = map(lambda x: self.header_mark + x , self.header)     except AttributeError :         text_list = []     #if exist, add the attribute list, join by the text separator     if attr_list : text_list += [join(attr_list,text_sep)]     #call the print method of the item using the text separator and the attribute list as options     #and add the resulting text into the text to print     text_list += [item.__str__(text_sep=text_sep, attr_list=attr_list) for item in self]     #join element of the text to print by a \n and return it     return join(text_list, '\n')

DANS Item def __str__(self, text_sep = '\t', attr_list = []):     '''     print x  x.__str__()     print all element of x using tabulation as default text separator     options :     x.__str__([text_sep, [attr_list]])     print only the values of the attributes specified in attr_list     return the values as text using text_sep as text separator

     '''     #if no attribute list, use all the attributes of self         if not attr_list : attr_list = self.keys()     #get the value of the attributes in attr_list or an empty string if attribute does'nt exist     text_val = [self.get(attr, '') for attr in attr_list]     #return the values in a text format join by text_sep     return join(map(str,text_val), text_sep)</pre>
<p>et j&#8217;ai donc ajouté un module de test pour cette fonction
<pre> def test_printed_data(self):     '''     teste si les donnees parsees sont imprimees correctement     '''     header_info_1 = "header_01"     header_info_2 = "header_02"     col_1 = "col_1"     col_2 = "col_2"     data_l1_c1 = "data_l1_c1"     data_l1_c2 = "data_l1_c2"     data_l2_c1 = "data_l2_c1"     data_l2_c2 = "data_l2_c2"

     #test with a complete file     test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test using a specific attribute list     test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     attr_list=[col_1]     test_file='''#%s#%s%s%s%s''' % (header_info_1, header_info_2, col_1, data_l1_c1, data_l2_c1)     self.assert_(test_item.__str__(attr_list=attr_list) == test_file)

     #test using a specific text separator     test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     attr_list=[col_1]     test_file='''#%s#%s%s;%s%s;%s%s;%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.assert_(test_item.__str__(text_sep=";") == test_file)

     #test with no header     test_file='''%s\t%s%s\t%s%s\t%s''' % (col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with no attribute list     test_file='''%s\t%s%s\t%s''' % (data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with no data     test_file='''%s\t%s''' % (col_1, col_2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with only header     test_file='''#%s#%s''' % (header_info_1, header_info_2)     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     #test with nothing     test_file=''     self.write_tmp_file(filetext = test_file)     test_item = Items(file_arg = 'tmp_file')     self.assert_(test_item.__str__() == test_file)

     remove('tmp_file')     def valid_object(self, nb_header_line, nb_col, nb_line):     '''     x.valid_object(nb_header_line, nb_col, nb_line)     create a tmp file with the given parameters     parse the file using Items     test if all data have been correctly parsed     '''     #create the name of the file using the parameters (it could have been an arbitrary filename)     filename = 'file_%s_%s_%s' % (nb_header_line, nb_col, nb_line)     #call the method for creating the file     self.create_tmp_file(filename, nb_header_line, nb_col, nb_line)

     self.valid_item(filename=filename, nb_header_line=nb_header_line, nb_col=nb_col, nb_line=nb_line)

     #delete te tmp file     self.delete_tmp_file(filename)
</pre>
<p>qui renvoie
<pre>...the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 5 tests in 0.065s

OK
</pre>
<p>je vais aussi ajouter une fonction assez pratique au parser.<br />il s&#8217;agit d&#8217;une sorte d&#8217;index des infos qui sont dans les attributs.<br />je ne suis pas sur que ce soit pertinenet car ca risque d&#8217;etre lourd d&#8217;un point de vue traitement.<br />il faut probablement que ce soit fait a la demande.<br />comment procéder ?<br />il faut une fonction de requete.<br />cette fonction va créer l&#8217;index nécessaire s&#8217;il n&#8217;existe pas et rechercher dedans par la suite.<br />elle va donc passer par une fonction de création d&#8217;index. cette fonction var créer l&#8217;index souhaité pour le ou les attributs passé en argument.<br />en laissant la possibilité d&#8217;avoir plusieurs attributs en argument, on s&#8217;assure que la fonction pourra etre utilisée dans d&#8217;autre cas, comme la création de ces index de manière explicite.<br />si aucun argument est passé a cette fonction alors l&#8217;ensemble des index pour chaque attribut sera créé (risque d&#8217;etre long)
<pre>def create_indexes(self, attr_list=[]):       '''       x.create_indexes([attr_list])       attr_list -&gt; list of string or str       create indexes for a list of attribute       '''       #test if there is an argument       if not attr_list :           #if not try to get the default attribute list           try :               attr_list = self.attr_list           except AttributeError :               #catch the error if it does'nt exist               print "no attribute for these data, indexes cannot be created"               #and stop function by raising error               raise       #build the index for each item       map(lambda x : self.build_index(x, attr_list), self)

   def build_index(self, item, attr_list):       '''       x.build_index(item, attr_list)       item -&gt; instance of item       attr_list -&gt; list of str or str       '''       #if attr_list is a single string, convert, put it in a list       if type(attr_list) == str : attr_list=[attr_list]       #for each attr       for attr in attr_list :           #test if it's a valid attribute           if attr not in self.attr_list :               print "%s is not a valide attribute" % attr               continue           #try to access to the value associated with the key attr           #if it doesn't exist, create the key as an empty dict and return it           try :               attr_index_list = self.indexes.setdefault(attr,{})           except AttributeError :               #catch the error if the attribute indexes does'nt exist,               #and create it               self.indexes = {}               attr_index_list = self.indexes.setdefault(attr,{})           #get the list associated with the key of the attribute of the item           #or an empty list if the key does'nt already exist           attr_index_item_list = attr_index_list.setdefault(item.get_attribute(attr), [])           #add item into this list           attr_index_item_list.append(item)

   def get_items_by_value(self, attr, value):       '''       item_list = x.get_items_by_value(attr, value)       attr -&gt; str       value -&gt; str, int or float       item_list -&gt; instance of Items       return a list of items having a specified value for the attribute attr       '''

       try :           #check if the attr is in the attribute list           if attr not in self.attr_list :               #if not raise a keyError               print "%s is not a valide attribute" % attr               raise IndexError, "%s is not a valide attribute" % attr       except AttributeError :           #catch the AttributeError if ther is no attribute list           print "no attribute list available"           raise       #try to access to the index of the given attribute       try :           attr_index_list = self.indexes[attr]       except AttributeError :           #catch the error if the attribute indexes doesn't exist           #or if the key attr does'nt exist           #the index for the given attribuite is created           self.create_indexes(attr)           #and put into attr_index_list           attr_index_list = self.indexes[attr]       except KeyError :           #catch the error if the attribute indexes doesn't exist           #or if the key attr does'nt exist           #the index for the given attribuite is created           self.create_indexes(attr)           #and put into attr_index_list           attr_index_list = self.indexes[attr]       #return an instance of items with the list of the items matching with the given value       return Items(item_list = attr_index_list.get(value, []))   </pre>
<p>j&#8217;ai du coup du modifier un peu le __init__ pour qu&#8217;il accepte des liste de item pour créer l&#8217;objet. cela permet dans une fonction de recherche de renvoyer un sous ensemble de l&#8217;objet de la meme forme que l&#8217;objet (une instance de items) plutot que une simple liste.<br />j&#8217;ai ajouté le code de test correspondant
<pre>def test_indexed_data(self):       '''       teste si les index creer sont correct       '''       header_info_1 = "header_01"       header_info_2 = "header_02"       col_1 = "col_1"       col_2 = "col_2"       col_3 = "col_3"       data_l1_c1 = "data_l1_c1"       data_l1_c2 = "data_l1_c2"       data_l2_c1 = "data_l2_c1"       data_l2_c2 = "data_l2_c2"       data_l2_c3 = "data_c3"       data_l1_c3 = "data_c3"       test_file='''#%s#%s%s\t%s\t%s%s\t%s\t%s%s\t%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, col_3, data_l1_c1, data_l1_c2, data_l1_c3, data_l2_c1, data_l2_c2, data_l2_c3)       self.write_tmp_file(filetext = test_file)       test_item = Items(file_arg = 'tmp_file')       items_index_1 = test_item.get_items_by_value(col_1, data_l1_c1)       self.assert_(isinstance(items_index_1,Items))       self.assert_(len(items_index_1)==1)       self.assert_(isinstance(items_index_1[0], Item))       self.assert_(items_index_1[0].get_attribute(col_1) == data_l1_c1)

       items_index_2 = test_item.get_items_by_value(col_3, data_l1_c3)       self.assert_(isinstance(items_index_2,Items))       self.assert_(len(items_index_2)==2)       self.assert_(isinstance(items_index_2[0], Item))       self.assert_(isinstance(items_index_2[1], Item))       self.assert_(items_index_2[0].get_attribute(col_3) == data_l1_c3)       self.assert_(items_index_2[1].get_attribute(col_3) == data_l2_c3)

       items_index_3 = test_item.get_items_by_value(col_1, 'toto')       self.assert_(isinstance(items_index_3,Items))       self.assert_(len(items_index_3)==0)       self.assertFalse(items_index_3)

       self.assertRaises(IndexError, test_item.get_items_by_value, attr = 'col_0', value = 'toto')     

       remove('tmp_file')</pre>
<p>le test renvoie alors
<pre>col_0 is not a valide attribute....the argument is not a regular file objectfile toto doesn't existpermission denied for file tmp_parse.txt..----------------------------------------------------------------------Ran 6 tests in 0.170s

OK</pre>
<p>Le parser a l&#8217;air a peu pret complet, a voir a l&#8217;usage.<br />&#8211;&gt; todo list tester le parser sur un plus gros fichier, type gal</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/79/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/79/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=79&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/14/14-avril-2008-ajout-du-module-de-conversion-des-donnees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>
	</item>
		<item>
		<title>9 avril 2008 &#8211; recherche du maximum de densité des segments (2)</title>
		<link>http://xtof78000.wordpress.com/2008/04/09/9-avril-2008-recherche-du-maximum-de-densite-des-segments-2/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/09/9-avril-2008-recherche-du-maximum-de-densite-des-segments-2/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 08:45:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/09/9-avril-2008-recherche-du-maximum-de-densite-des-segments-2/</guid>
		<description><![CDATA[10h43suite de recherche du maximum de densité des segmentsje dois donc modifier mon code pour tenir compte du décalage de 18 nucléotides.2 possibilités:- je modifie les positions des tags sur chr1278- je rajoute une étape dans le script de find_max_segment qui repositionne le segment comme par rapport au start des sages. la 2eme solution est [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=78&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">10h43</span><br />suite de <a href="http://gim-bioinfo.blogspot.com/2008/04/8-fvrier-2008-recherche-du-maximum-de.html">recherche du maximum de densité des segments</a><br />je dois donc modifier mon code pour tenir compte du décalage de 18 nucléotides.<br />2 possibilités:<br />- je modifie les positions des tags sur chr1278<br />- je rajoute une étape dans le script de find_max_segment qui repositionne le segment comme par rapport au start des sages.</p>
<p>la 2eme solution est simple (la première aussi cela dit) mais elle implique que le génome utilisé sera toujours décalé de 18.<br />c&#8217;est finalement idiot, il serait mieux de partir avec un génome bien recalé.<br />quand j&#8217;étudie en détail les position je constate que:<br />- les positions sur les brins watson sont celles du premier nucléotide du sage (coté 5&#8242;)<br />- les positions sur les brins crick sont celles du dernier nucléotide avant le sage (en 5&#8242;)<br />ce qui nous intéresse c&#8217;est finalement la position du premier nucléotide après le sage, en 3&#8242;<br />je dois donc faire :<br />-&gt; pos + 18 pour les tag sur les brin watson<br />-&gt; pos &#8211; 19 pour les tag sur le brin crick</p>
<p>la matrice chr_len donne les positions de chaque chromosome et brin sur le génome linéarisé. a partir de cette matrice je peux effectuer les corrections nécessaires.<br />j&#8217;ai écrit un script pour ca
<pre>function res = tag_position_correction(genome, chr_len)%res = tag_position_correction(genome, chr_len)%fonction permettant de modifier la position des tag sur un génome linearisé%de +18 s'ils sont sur le brin watson et -19 sur le brin crick%la position des brin est donnée dans chr_len

%recupere la taille du genomenb_chr = size(chr_len,1);%alloue l'espace pour le resultatres = zeros(size(genome));%pour chaque birn de chaque chromosomefor i = 1:nb_chr %recupère l'information du brin strand = chr_len{i,2}; if strcmp('c', strand)     %si c'est crick alors decalage de -19     decalage = -19; else     %si c'est watson alors decalage de +18     decalage = 18; end %teste de la valeur de i dans la boucle if i&gt;1     %si i&gt;1 alors on recupère la position du début du chromosome sur la     %ligne précédente     %on ajoute +1 car la ligne précédente donne le dernier nucléotide     %du brin précédent     %on rajoute + 19 pour anticiper le décalage     deb = chr_len{i-1,4} + 1 + 19; else     %si i=1 alors il n'y a pas de ligne précédente, on demarre au début     %du chromosome

     deb=1 + 19; end %on récupère la position de fin et on retire 18 pour anticiper le %décalage fin = chr_len{i,4} - 18; %on copie dans res la partie du génome entre deb et fin %on les affecte au position deb + decalage à fin + decalage res(deb + decalage:fin + decalage) = genome(deb:fin);end</pre>
<p>je l&#8217;appelle avec la commande <code>chr1278_2 = tag_position_correction(chr1278, chr_len);</code></p>
<p>je peux maintenant réappliquer le script density sur cette matrice<br /><code>density = densite_sage(chr1278_2, 20);</code><br />et j&#8217;applique le script find_max_segment dessus<br /><code>res=find_max_segment(density, ratio2_5_100_1);</code><br />dans ratio2_5_100_1 j&#8217;avais également une erreur de position pour les segment des brin crick qui sont decalés de +1<br />j&#8217;ai créé segment_list a partir de ratio2_5_100_1 en corrigeant ce décalage.<br />es brins ont tous une référence (de 1 à 34)<br />les brins crick sont tous impaires<br />je cherche pour chaque segment si la référence du brin sur lequel il se trouve<br />est paire ou non
<pre>l=mod(res(:,6),2);</pre>
<p>comme j&#8217;ai 1 pour les brin crick et 0 pour les brin watson, et que le décalage est de +1<br />je retire la matrice l aux colonnes contenant les positions des brins
<pre>segment_list(:,[2 3 7 8]) = segment_list(:,[2 3 7 8]) - l*ones(1,4);</pre>
<p>puis je recherche le max de densité des segments
<pre>res=find_max_segment(density, segment_list);</pre>
<p>le résultat semble correct.<br />toutefois quand les tags d&#8217;un meme segments sont éloignés d&#8217;une distance supérieur à la fenetre utilisée pour calculer la densité, le max de densité est mal placé.<br />il faut peut-etre utiliser 100 comme fenetre pour etre sur de couvrir les segments les plus grand.<br /><code>density_100 = densite_sage(chr1278_2, 100);<br />res_100=find_max_segment(density_100, segment_list);</code><br />cette fois il ne semble plus y avoir de probleme</p>
<p>il faut donc exporter ce résultat.<br />le résultat est enregistré dans la matrice <span style="color:rgb(255, 0, 0);">seg_list_dist_density_max</span><br />avant de l&#8217;exporter j&#8217;ajoute une colonne avec l&#8217;ancienne valeur de milieu de segment.<br />cela permettra de ne pas modifier les références des segments des brins crick.<br />je modifierai les références plus tard.<br />pour ajouter la valeur du milieu du segment je fais<br /><code>seg_list_dist_density_max(:,end+1)=floor(mean(ratio2_5_100_1(:,7:8)'))';</code><br />je sauve ensuite la matrice en csv<br /><code>save(strcat('seg_list_dist_density_max','.mat.csv'),'seg_list_dist_density_max', '-ascii','-tabs');</code><br />puis je l&#8217;exporte sur douanier rousseau<br />scp <code>berthe:/home/gim/sage/total/stats/ratio2_5/max_segments/seg_list_dist_density_max.mat.csv /home/gim/sage/total/stats/ratio2_5/max_segments/</code></p>
<p>j&#8217;execute sur ce fichier les script de segment.py<br />en modifiant le nom du fichier d&#8217;entrée.<br />j&#8217;ai modifié aussi le script de matlab2csv pour qu&#8217;il ajoute dans la ligne de titre les colonnes density_max et mid</p>
<p>le fichier contenant les résultat brut en csv est <code>~/sage/total/stats/ratio2_5/max_segments/seg_list_dist_density_max.csv</code><br />le fichier contenant les distances avec les features environanantes est dans <code>~/sage/total/stats/ratio2_5/max_segments/segments_description_density_max.csv</code></p>
<p>je transfert ce fichier sur bambino<br />j&#8217;applique dessus la macro <code>classification</code> du fichier <code>F:/users/christophe/search_features_A_and_B</code><code>.xls </code>a<br />je récupère le fichier <code>F:/users/christophe/sements_description_density_max</code><code>.xls</code><br />je l&#8217;exporte sur douanierousseau dans<br /><code>~/sage/total/stats/ratio2_5/max_segments/segments_description_density_max.xls</code><br />j&#8217;élimine les colonnes avec du texte<br />je sauve dans <code>~/sage/total/stats/ratio2_5/max_segments/segments_distance_to_feature_using_density_max.csv </code><br />j&#8217;exporte sur berthemorisot<br />je l&#8217;ouvre dans matlab dans la matrice data_using_density_max<br />j&#8217;ouvre data_using_max et data_using_mid dans distances_using_max.mat<br />je compare les résultats obtenus avec les autres matrices.<br />j&#8217;ai écrit un script qui affiche les courbes pour les 3 matrices en fn de la classe, et de la config des features
<pre>function plot_with_n_variable(classe, feature_extreme, feature_sens, data_using_max, data_using_density_max, data_using_mid)  cols=cell(4,3);

  cols{1,1}='start';  cols{1,2}='sens';  cols{1,3}=[10 16];

  cols{2,1}='start';  cols{2,2}='antisens';  cols{2,3}=[12 18];

  cols{3,1}='end';  cols{3,2}='sens';  cols{3,3}=[9 17];

  cols{4,1}='end';  cols{4,2}='antisens';  cols{4,3}=[15 19];

  for i=1:4      if strcmp(cols{i,1}, feature_extreme) &amp;&amp; strcmp(cols{i,2}, feature_sens)          columns=cols{i,3};      end  end

  figure;  title(strcat('distance from MAX of segment to ',feature_extreme, '  of features in  ',   feature_sens));  hold all;  for i=1:10  distance_c1_start_sens=mk_distance_hist(data_using_max, classe, columns, -1000, 1000, i, 20);  hist_c1_start_sens=frequence(distance_c1_start_sens,-1000,1000,200);  plot(hist_c1_start_sens(:,1),hist_c1_start_sens(:,2))  end

  figure;  title(strcat('distance from DENSITY MAX of segment to ',feature_extreme, ' of features in ', feature_sens));  hold all;  for i=1:10  distance_c1_start_sens=mk_distance_hist(data_using_density_max, classe, columns, -1000, 1000, i, 20);  hist_c1_start_sens=frequence(distance_c1_start_sens,-1000,1000,200);  plot(hist_c1_start_sens(:,1),hist_c1_start_sens(:,2))  end

  figure;  title(strcat('distance from MID of segment to ',feature_extreme, ' of features in ', feature_sens));  hold all;  for i=1:10  distance_c1_start_sens=mk_distance_hist(data_using_mid, classe, columns, -1000, 1000, i, 20);  hist_c1_start_sens=frequence(distance_c1_start_sens,-1000,1000,200);  plot(hist_c1_start_sens(:,1),hist_c1_start_sens(:,2))  end</pre>
<p>je peux alors utiliser la commande<br /><code>plot_with_n_variable(1, 'start', 'sens', data_using_max, data_using_density_max, data_using_mid)</code></p>
<p><a href="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24pI/AAAAAAAAASg/1ZPl-BGLyzw/s1600-h/mid2start_c1_multi_n.png"><img style="cursor:pointer;" src="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24pI/AAAAAAAAASg/1ZPl-BGLyzw/s400/mid2start_c1_multi_n.png" alt="" border="0" /></a><code><br /></code><a href="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24qI/AAAAAAAAASo/GShdAHD35j4/s1600-h/max2start_c1_multi_n.png"><img style="cursor:pointer;" src="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24qI/AAAAAAAAASo/GShdAHD35j4/s400/max2start_c1_multi_n.png" alt="" border="0" /></a><br /><a href="http://bp0.blogger.com/_90Wu6Gs32-U/R_zsmBz24rI/AAAAAAAAASw/CHJPMbL9-vU/s1600-h/density_max2start_c1_muli_n.png"><img style="cursor:pointer;" src="http://bp0.blogger.com/_90Wu6Gs32-U/R_zsmBz24rI/AAAAAAAAASw/CHJPMbL9-vU/s400/density_max2start_c1_muli_n.png" alt="" border="0" /></a><br />on observe une dispersion légèrement plus faible pour les résultats obtenus en utilisant le maximum de densité des segments.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/78/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/78/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=78&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/09/9-avril-2008-recherche-du-maximum-de-densite-des-segments-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24pI/AAAAAAAAASg/1ZPl-BGLyzw/s400/mid2start_c1_multi_n.png" medium="image" />

		<media:content url="http://bp3.blogger.com/_90Wu6Gs32-U/R_zslxz24qI/AAAAAAAAASo/GShdAHD35j4/s400/max2start_c1_multi_n.png" medium="image" />

		<media:content url="http://bp0.blogger.com/_90Wu6Gs32-U/R_zsmBz24rI/AAAAAAAAASw/CHJPMbL9-vU/s400/density_max2start_c1_muli_n.png" medium="image" />
	</item>
		<item>
		<title>8 avril 2008 &#8211; recherche du maximum de densité des segments</title>
		<link>http://xtof78000.wordpress.com/2008/04/08/8-avril-2008-recherche-du-maximum-de-densite-des-segments/</link>
		<comments>http://xtof78000.wordpress.com/2008/04/08/8-avril-2008-recherche-du-maximum-de-densite-des-segments/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 15:52:00 +0000</pubDate>
		<dc:creator>xtof78000</dc:creator>
				<category><![CDATA[densité]]></category>
		<category><![CDATA[maximum]]></category>
		<category><![CDATA[sage]]></category>
		<category><![CDATA[segment]]></category>

		<guid isPermaLink="false">http://xtof78000.wordpress.com/2008/04/08/8-avril-2008-recherche-du-maximum-de-densite-des-segments/</guid>
		<description><![CDATA[17h52 :au lieu de localiser les segments par rapport à la position du maximum de tag dans un segment, je vais le faire par rapport à la position du maximum de densité.pour evaluer la densité, je fais avancer une fenetre dont la taille L est a déterminer.je compter alors le nb de sage dans la [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=77&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span class="time">17h52</span> :<br />au lieu de localiser les segments par rapport à la position du maximum de tag dans un segment, je vais le faire par rapport à la position du maximum de densité.<br />pour evaluer la densité, je fais avancer une fenetre dont la taille L est a déterminer.<br />je compter alors le nb de sage dans la fenetre et cette valeur sera alors la densité pour la position correspondant au milieu de la fenetre.<br />ainsi si plusieurs tag se suivent mais sans se chevaucher, la fenetre de densité va augmenter qd meme en s&#8217;approchant du milieu du segment car c&#8217;est a cet endroit qu&#8217;il y aura un max de segment environnant.<br /><a href="http://bp0.blogger.com/_90Wu6Gs32-U/R_uckRz24mI/AAAAAAAAASI/A2RdZ4PIrNQ/s1600-h/densite_01.gif"><img style="cursor:pointer;" src="http://bp0.blogger.com/_90Wu6Gs32-U/R_uckRz24mI/AAAAAAAAASI/A2RdZ4PIrNQ/s400/densite_01.gif" alt="" border="0" /></a><br /><a href="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24nI/AAAAAAAAASQ/fxWCDJ5goLM/s1600-h/densite_02.gif"><img style="cursor:pointer;width:303px;height:450px;" src="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24nI/AAAAAAAAASQ/fxWCDJ5goLM/s400/densite_02.gif" alt="" border="0" /></a><br /><a href="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24oI/AAAAAAAAASY/LEF7zFJwzlk/s1600-h/densite_03.gif"><img style="cursor:pointer;width:317px;height:228px;" src="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24oI/AAAAAAAAASY/LEF7zFJwzlk/s400/densite_03.gif" alt="" border="0" /></a><br />le schema ci-dessus représente un comptage théorique pour un segments dont aucun tag ne se chevauchent. les points bleus représentent la courbe de densité qui serait obtenu. on voit que le max de densité serait environ au 2/3 du segment.<br />j&#8217;ai écrit une fonction pour le calcul de la densité
<pre>function density = densite_sage(chr, window)%density = densite_sage(chr, window)%-input%  chr -&gt; entire genome%  window -&gt; size of the window to determine the densitty%-output%  density -&gt; result, matrice with the size of chr

%recupere la taille du genometaille_genome=length(chr);%alloue l'espace mémoire necessaire pour le resultatdensity=zeros(taille_genome,1);%calcul la taille de demi-fenetre%je ne garde que la partie entièrew=floor(window/2);%calcul la somme de tout les tag pour une position i sur une fenetre%encandrant cette position%la fenetre est de taille window si window est impaire et window +1 si%window est pairefor i=1+w:taille_genome-w    density(i)=sum(chr(i-w:i+w));end</pre>
<p>le calcul est très simple et renvoie une matrice de densité<br />j&#8217;ouvre le fichier /data/users_data/helen/454/sageData/total/stats/ratio2_5/max_segments/matlab.mat<br />puis je créé la matrice chr1278 qui contient tous les tags des manip 1, 2 7 et 8 réparti sur l&#8217;ensemble du génome.<br /><code>chr1278=header(:,5)</code><br />puis j&#8217;execute la commande<br /><code>density = densite_sage(chr1278, 20);</code><br />j&#8217;ai donc ma matrice densité.<br />il faut maintenant associer a chaque segment son max de densité.<br />j&#8217;ai une matrice de segment ratio2_2_100_1<br />chaque ligne correspond a un segment dont j&#8217;ai les coordonnées dans les 2eme et 3eme colonnes.<br />je vais donc parcourir cette matrice<br />récupérer les coordonnées du segment sur le génome linéarisé (chr1278)<br />puis regarder dans cette section sur density ou se trouve le max<br />s&#8217;il y a plusieurs positions max, ca sera la plus centrale qui sera prise.<br />la position trouvée est inscrite dans la matrice des segment dans la dernière colonne</p>
<p>j&#8217;ai écrit un script pour ca
<pre>function segment_data = find_max_segment(chr_data, segment_data)%fn pour trouver dans chr_data le max pour chaque segment de segment_data%si chr_data est la liste des tag réparti sur le génome alors la fonction%renvoie la position du nb max de tag%si chr_data est la densité de sage sur tout le génome, alors la fonction%renvoie la position de la densité max de tag dans le segment   [l,c] = size(segment_data);   for i=1:l      start_seg = segment_data(i,2);      stop_seg = segment_data(i,3);      segment=chr_data(start_seg:stop_seg,1);      max_seg=find(segment==max(segment));      pos = floor(mean(length(max_seg)));      segment_data(i,c+1)=segment_data(i, 7) + max_seg(pos) - 1;   end</pre>
<p>script très simple.<br />je le teste par la commande <code>res=find_max_segment(density, ratio2_5_100_1);</code><br />le programme marche bien mais en regardant les résultats j&#8217;ai constaté que les valeurs étaient assez étrange et souvent mal placée.<br />en regardant de plus pret j&#8217;ai compris l&#8217;erreur que j&#8217;avais faite.<br />les positions des tag sur le génnome correspondent au debut des sage sur les chromosome alors que les position des segments dans la liste des segment correspondent à la première position après la fin du sage, soit 18 nucleotides plus loin. la recherche du max se fait donc avec un decalage de 18, mais pas toujours dans le meme sens selon que la partie du génome considérée soit sur le brin watson ou crick.<br />je vais devoir corriger cela</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/xtof78000.wordpress.com/77/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/xtof78000.wordpress.com/77/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xtof78000.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xtof78000.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xtof78000.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xtof78000.wordpress.com&amp;blog=3763721&amp;post=77&amp;subd=xtof78000&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xtof78000.wordpress.com/2008/04/08/8-avril-2008-recherche-du-maximum-de-densite-des-segments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d364e311ed959303beab5bf22d3a6d13?s=96&#38;d=identicon" medium="image">
			<media:title type="html">xtof78000</media:title>
		</media:content>

		<media:content url="http://bp0.blogger.com/_90Wu6Gs32-U/R_uckRz24mI/AAAAAAAAASI/A2RdZ4PIrNQ/s400/densite_01.gif" medium="image" />

		<media:content url="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24nI/AAAAAAAAASQ/fxWCDJ5goLM/s400/densite_02.gif" medium="image" />

		<media:content url="http://bp2.blogger.com/_90Wu6Gs32-U/R_uckxz24oI/AAAAAAAAASY/LEF7zFJwzlk/s400/densite_03.gif" medium="image" />
	</item>
	</channel>
</rss>
