Commit e343034f authored by Bertrand  NÉRON's avatar Bertrand NÉRON

first import of secreton project

parent 56856570
Ci-joints deux fichiers de donnees a combiner pour avoir l'information pour chaque page statique.
Ces deux fichiers sont tabules, la tabulation servant de separateur de champs. Un "header" démarre chaque fichier, les champs seront désignés par la suite par les noms de colonne correspondant précédé d'un "$". Je ne sais pas à ce stade à quel point je dois vous détailler ceci... J'ai filé le texte de description avec des questions sur les fonctionnalités que j'aurais souhaité implémenter. N'hésitez pas si vous avez des idées/propositions pour améliorer ça !
La colonne $Replicon des deux fichiers sert a faire le lien entre les systemes detectes (dans "info_syst.dat") et les informations relatives a chaque genome correspondant (dans le fichier "info_replicon.dat").
Une page statique correspondra à un systeme detecte (valeurs differentes de la colonne $System-code de "info_syst.dat").
Description des fichiers:
2) "info_replicon.dat"
Ce fichier comporte les informations necessaires a la creation des en-tetes de chaque page.
Exemple d'en-tete d'une page:
"""
Results of T3SS search in $Strain
Taxonomic ID: $Taxid
Full taxonomy: $Taxonomy
Replicon type: $Replicon_type
Replicon code: $Replicon
"""
Question1: Est-ce que l'on peut envisager de faire des champs "requetables"? Par exemple de faire des recherches sur le nom de la souche ($Strain) ? L'ideal serait que tous les champs précédents le soient, puis que la requete sorte une liste de liens vers les pages correspondantes?
1) "info_syst.dat"
Ce fichier comporte les resultats de la recherche du systeme de secretion de type III (T3SS) dans tous les genomes de notre methode de detection. Les données sont classées par nom de $Replicon, puis de gène $Gene-code qui correspond aussi à leur ordre le long des génomes analysés.
L'information relative à un système détecté (comme un système correspond à plusieurs gènes à coté, sauf quelques cas) sera donc trouvé dans des lignes consécutives et qui portent le meme $System-code.
On souhaiterait donc la creation d'une page statique par valeur possible de $System-code.
Chaque ligne de ce fichier correspond à un gène (d'identifiant unique $Gene-code, mais on a aussi l'identifiant unique de Refseq $Gene-Id) faisant partie, ou aux bords d'un T3SS. La taille $Protein-length, le sens de transcription $Strand et la position génomique (quand elle est connue) $Begin et $End (de début et fin) de ce gène sont indiqués.
Si ce gène a eu un hit avec un de nos profils HMMer, les colonnes suivantes indiquent quel profil de gène a "matché" $Match, puis des valeurs de score et statistiques de Hmmer sont données. Enfin, chaque sytème détecté s'est vu phylogénétiquement attribué une famille de T3SS, c'est la colonne $T3SS-family
Comme nous l'avons discuté, nous aimerions que ces donnees soient affichées:
- sous forme graphique (représentation graphique des résultats de détection le long du génome)
- sous forme de tableau (présentation détaillée des résultats de Hmmer, des valeurs statistiques obtenues,...)
Je continue ma description d'une page type:
Il faudrait donc faire apparaitre de façon graphique les resultats de la recherche, sous forme de rectangles contigus afin de représenter les gènes le long du génome (lignes successives d'un meme système). Pour certains des gènes (en fait pour tous sauf ceux de deux organismes) nous disposons du sens du gène (colonne $Strand). Dans le cas ou cette information serait disponible, serait-il possible de représenter le gène par un rectangle-flèche? Pour la valeur "D" (pour direct), cela correspondrait à une flèche allant de gauche à droite, tandis que pour la valeur "C" (complementary), à une flèche allant de droite à gauche.
Attention, pour certains systèmes, tous les gènes d'un système ne sont pas contigus... (ce sont ceux dont le nom de système $System-code se termine par "p"). Dans ce cas les numéros (comptés de 10 en 10) contenus dand le champ $Gene-code ou $Gene-Id ne se suivent pas. Pourrait-on faire apparaitre graphiquement cela? Dans ce cas on pourrait soit ajouter un signe (comme "//") pour indiquer la césure dans les positions génomiques, ou encore imaginer de revenir à la ligne pour chaque "ilot" de gènes contigus.
Question2: Ce serait aussi intéressant de pouvoir attribuer une couleur par gène du système différent (valeur $Match), et pour les gènes ayant un $Match renseigné (différent de "-" qui désigne une valeur manquante) d'afficher le nom du gène ($Match) en noir au milieu du rectangle. Les rectangles des gènes sans valeur $Match resteraient alors vides. C'est possible?
Question3: J'ai créé un schéma du système (en svg), serait-il possible de l'inclure en titre de page par exemple (à coté de la 1ère ligne d'en tete par exemple, ou meme d'un titre plus général), et faire correspondre les couleurs de ce schéma avec les couleurs des gènes dans les représenations graphiques des résultats discutées juste au-dessus?
Après la représentation graphique du résultat, ce serait bien d'avoir un tableau avec les résultats détaillés, avec d'abord un titre:
"""
Summary of T3SS search for the system "$System-code"
Phylogenetically predicted to belong to the $T3SS-family T3SS sub-type.
"""
Suivi du tableau (j'ai mis ici l'en-tete, puis les valeurs de champs correspondantes):
"""
Gene-code Gene-Id Protein-length Strand Begin End Match Full-score E-value Best-domain-score Best-domain-evalue C-value Coverage-profile Match-begin Match-end
$Gene-code $Gene-Id $Protein-length $Strand $Begin $End $Match $Full-score $E-value $Best-domain-score $Best-domain-evalue $C-value $Coverage-profile $Match-begin $Match-end
"""
This diff is collapsed.
This diff is collapsed.
[
// filenames matching these regexps will not be pushed to the database
// uncomment to activate; separate entries with ","
// ".*~$"
// ".*\\.swp$"
// ".*\\.bak$"
"\\.project" ,
"\\.couchapprc",
".*\\.swp$"
]
## Generated CouchApp
This is meant to be an example CouchApp and to ship with most of the CouchApp goodies.
Clone with git:
git clone git://github.com/couchapp/example.git
cd example
Install with
couchapp push . http://localhost:5984/example
or (if you have security turned on)
couchapp push . http://adminname:adminpass@localhost:5984/example
You can also create this app by running
couchapp generate example && cd example
couchapp push . http://localhost:5984/example
Deprecated: *couchapp generate proto && cd proto*
## Todo
* factor CouchApp Commonjs to jquery.couch.require.js
* use $.couch.app in app.js
## License
Apache 2.0
<!DOCTYPE html>
<html>
<head>
<title>Example CouchApp</title>
<link rel="stylesheet" href="style/main.css" type="text/css">
</head>
<body>
<div id="account"></div>
<h1>Example CouchApp</h1>
<div id="profile">
</div>
<div id="content"></div>
<div id="sidebar">
<p>Edit welcome message.</p>
<p>Ideas: You could easily turn this into a photo sharing app,
or a grocery list, or a chat room. <a href="https://github.com/couchapp/example">Code for this app is on Github.</a></p>
</div>
</body>
<script src="/_utils/script/sha1.js"></script>
<script src="/_utils/script/json2.js"></script>
<script src="/_utils/script/jquery.js"></script>
<script src="/_utils/script/jquery.couch.js"></script>
<script src="vendor/couchapp/jquery.couchLogin.js"></script>
<script src="vendor/couchapp/jquery.couchProfile.js"></script>
<script src="vendor/couchapp/md5.js"></script>
<script src="vendor/couchapp/jquery.mustache.js"></script>
<!-- templates used by app.js -->
<script id="new-message" type="text/x-mustache" charset="utf-8">
<div class="avatar">
{{#gravatar_url}}<img src="{{gravatar_url}}"/>{{/gravatar_url}}
<div class="name">
{{name}}
</div>
</div>
<form id="create-message">
<label>New message from {{nickname}}: <input type="text" name="message" size=60 value=""></label>
</form>
<div style="clear:left;"></div>
</script>
<script id="recent-messages" type="text/x-mustache" charset="utf-8">
<h3>Recent Messages</h3>
<ul id="items">
{{#items}}
<li>
<div class="avatar">
{{#gravatar_url}}<img src="{{gravatar_url}}" alt="{{name}}"/>{{/gravatar_url}}
<div class="name">
{{nickname}}
</div>
</div>
<p>{{message}}</p>
<div style="clear:left;"></div>
</li>
{{/items}}
</ul>
<p><em>Protip:</em> If you setup continuous replication between this database and a remote one, this list will reflect remote changes in near real-time.</p>
<p>This would be a good place to add pagination.</p>
</script>
<script src="script/app.js"></script>
</html>
// Apache 2.0 J Chris Anderson 2011
$(function() {
// friendly helper http://tinyurl.com/6aow6yn
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
var path = unescape(document.location.pathname).split('/'),
design = path[3],
db = $.couch.db(path[1]);
function drawItems() {
db.view(design + "/recent-items", {
descending : "true",
limit : 50,
update_seq : true,
success : function(data) {
setupChanges(data.update_seq);
var them = $.mustache($("#recent-messages").html(), {
items : data.rows.map(function(r) {return r.value;})
});
$("#content").html(them);
}
});
};
drawItems();
var changesRunning = false;
function setupChanges(since) {
if (!changesRunning) {
var changeHandler = db.changes(since);
changesRunning = true;
changeHandler.onChange(drawItems);
}
}
$.couchProfile.templates.profileReady = $("#new-message").html();
$("#account").couchLogin({
loggedIn : function(r) {
$("#profile").couchProfile(r, {
profileReady : function(profile) {
$("#create-message").submit(function(e){
e.preventDefault();
var form = this, doc = $(form).serializeObject();
doc.created_at = new Date();
doc.profile = profile;
db.saveDoc(doc, {success : function() {form.reset();}});
return false;
}).find("input").focus();
}
});
},
loggedOut : function() {
$("#profile").html('<p>Please log in to see your profile.</p>');
}
});
});
\ No newline at end of file
(function () {
var tokenRegex = /\{([^\}]+)\}/g,
objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties
replacer = function (all, key, obj) {
var res = obj;
key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {
name = name || quotedName;
if (res) {
if (name in res) {
res = res[name];
}
typeof res == "function" && isFunc && (res = res());
}
});
res = (res == null || res == obj ? all : res) + "";
return res;
},
fill = function (str, obj) {
return String(str).replace(tokenRegex, function (all, key) {
return replacer(all, key, obj);
});
};
Raphael.fn.popup = function (X, Y, set, pos, ret) {
pos = String(pos || "top-middle").split("-");
pos[1] = pos[1] || "middle";
var r = 5,
bb = set.getBBox(),
w = Math.round(bb.width),
h = Math.round(bb.height),
x = Math.round(bb.x) - r,
y = Math.round(bb.y) - r,
gap = Math.min(h / 2, w / 2, 10),
shapes = {
top: "M{x},{y}h{w4},{w4},{w4},{w4}a{r},{r},0,0,1,{r},{r}v{h4},{h4},{h4},{h4}a{r},{r},0,0,1,-{r},{r}l-{right},0-{gap},{gap}-{gap}-{gap}-{left},0a{r},{r},0,0,1-{r}-{r}v-{h4}-{h4}-{h4}-{h4}a{r},{r},0,0,1,{r}-{r}z",
bottom: "M{x},{y}l{left},0,{gap}-{gap},{gap},{gap},{right},0a{r},{r},0,0,1,{r},{r}v{h4},{h4},{h4},{h4}a{r},{r},0,0,1,-{r},{r}h-{w4}-{w4}-{w4}-{w4}a{r},{r},0,0,1-{r}-{r}v-{h4}-{h4}-{h4}-{h4}a{r},{r},0,0,1,{r}-{r}z",
right: "M{x},{y}h{w4},{w4},{w4},{w4}a{r},{r},0,0,1,{r},{r}v{h4},{h4},{h4},{h4}a{r},{r},0,0,1,-{r},{r}h-{w4}-{w4}-{w4}-{w4}a{r},{r},0,0,1-{r}-{r}l0-{bottom}-{gap}-{gap},{gap}-{gap},0-{top}a{r},{r},0,0,1,{r}-{r}z",
left: "M{x},{y}h{w4},{w4},{w4},{w4}a{r},{r},0,0,1,{r},{r}l0,{top},{gap},{gap}-{gap},{gap},0,{bottom}a{r},{r},0,0,1,-{r},{r}h-{w4}-{w4}-{w4}-{w4}a{r},{r},0,0,1-{r}-{r}v-{h4}-{h4}-{h4}-{h4}a{r},{r},0,0,1,{r}-{r}z"
},
offset = {
hx0: X - (x + r + w - gap * 2),
hx1: X - (x + r + w / 2 - gap),
hx2: X - (x + r + gap),
vhy: Y - (y + r + h + r + gap),
"^hy": Y - (y - gap)
},
mask = [{
x: x + r,
y: y,
w: w,
w4: w / 4,
h4: h / 4,
right: 0,
left: w - gap * 2,
bottom: 0,
top: h - gap * 2,
r: r,
h: h,
gap: gap
}, {
x: x + r,
y: y,
w: w,
w4: w / 4,
h4: h / 4,
left: w / 2 - gap,
right: w / 2 - gap,
top: h / 2 - gap,
bottom: h / 2 - gap,
r: r,
h: h,
gap: gap
}, {
x: x + r,
y: y,
w: w,
w4: w / 4,
h4: h / 4,
left: 0,
right: w - gap * 2,
top: 0,
bottom: h - gap * 2,
r: r,
h: h,
gap: gap
}][pos[1] == "middle" ? 1 : (pos[1] == "top" || pos[1] == "left") * 2];
var dx = 0,
dy = 0,
out = this.path(fill(shapes[pos[0]], mask)).insertBefore(set);
switch (pos[0]) {
case "top":
dx = X - (x + r + mask.left + gap);
dy = Y - (y + r + h + r + gap);
break;
case "bottom":
dx = X - (x + r + mask.left + gap);
dy = Y - (y - gap);
break;
case "left":
dx = X - (x + r + w + r + gap);
dy = Y - (y + r + mask.top + gap);
break;
case "right":
dx = X - (x - gap);
dy = Y - (y + r + mask.top + gap);
break;
}
out.translate(dx, dy);
if (ret) {
ret = out.attr("path");
out.remove();
return {
path: ret,
dx: dx,
dy: dy
};
}
set.translate(dx, dy);
return out;
};
})();
\ No newline at end of file
This diff is collapsed.
.gene_sctC { background-color: blue}
.gene_sctD { background-color: yellow}
.gene_sctF { background-color: red}
.gene_sctI { background-color: green}
.gene_sctJ { background-color: orange}
.gene_sctL { background-color: pink}
\ No newline at end of file
/* add styles here */
body {
font:1em Helvetica, sans-serif;
}
h1 {
margin-top:0;
}
#account {
float:right;
}
#profile {
border:4px solid #edd;
background:#fee;
padding:8px;
margin-bottom:8px;
}
#content {
border:4px solid #dde;
background:#eef;
padding:8px;
width:60%;
float:left;
}
#items li {
border:4px solid #f5f5ff;
background:#fff;
padding:8px;
margin:4px 0;
}
table {
border-collapse:collapse;
border :1px solid #000;
}
th{ border :1px solid #000;}
td{
border: 1px solid #999;
padding: .3em;
margin: 0;
}
#genes_schema{
width: 1820px;
border:1px solid black;
}
_design/secreton
\ No newline at end of file
{
"name": "Basic CouchApp",
"description": "CouchApp with changes feed and form support."
}
\ No newline at end of file
javascript
\ No newline at end of file
function(doc, req) {
//!json templates.secretion_system
var Mustache = require("vendor/couchapp/lib/mustache");
if( doc !== null){
return Mustache.to_html( templates.secretion_system , doc );
}
else{
return "not found" ;
}
}
\ No newline at end of file
function(doc, req) {
//!json templates.secretion_system
var Mustache = require("vendor/couchapp/lib/mustache");
if( doc !== null){
return Mustache.to_html( templates.secretion_system , doc );
}
else{
return "not found" ;
}
}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>secretion system {{code}}</title>
<script src="/_utils/script/jquery.js"></script>
<script src="../../script/raphael-min.js"></script>
<script type="text/javscript">
</script>
<link rel="stylesheet" href="../../style/main.css" type="text/css">
<link rel="stylesheet" href="../../style/color.css" type="text/css">
</head>
<body>
<h1>Secretion system {{code}}</h1>
<ul>
<li>code: {{code}}</li>
<li>T3SS family:{{T3SS_familly}}</li>
</ul>
<h2>Replicon</h2>
<ul>
{{#replicon}}
<li>name: {{name}}</li>
<li>taxid: {{taxid}}</li>
<li>strain: {{strain}}</li>
<li>taxonomy: {{taxonomy}}</li>
<li>type: {{type}}</li>
{{/replicon}}
</ul>
<div id="genes-schema">
</div>
<h3>Genes</h3>
<table>
<thead>
<tr>
<th>Gene-code</th><th>Gene-Id</th><th>Protein-length</th><th>Strand</th><th>Begin</th><th>End</th>
<th>Match</th><th>Full-score</th><th>E-value</th>
<th>Best-domain-score</th><th>Best-domain-evalue</th><th>C-value</th><th>Coverage-profile</th>
<th>Match-begin</th><th>Match-end</th>
</tr>
</thead>
<tbody>
{{#genes}}
<tr>
<td id="{{code}}" {{#match}} class="gene_{{match}}" {{/match}}>{{code}}</td><td>{{id}}</td><td>{{protein_length}}</td><td>{{strand}}</td><td>{{begin}}</td><td>{{end}}</td>
<td>{{match}}</td><td>{{full_score}}</td><td>{{e_value}}</td>
<td>{{best_domain_score}}</td><td>{{best_domain_evalue}}</td><td>{{c_value}}</td><td>{{coverage_profile}}</td>
<td>{{match_begin}}</td><td>{{match_end}}</td>
</tr>
{{/genes}}
</tbody>
</table>
</body>
</html>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>secretion system {{code}}</title>
<link rel="stylesheet" href="../../style/main.css" type="text/css">
<link rel="stylesheet" href="../../style/color.css" type="text/css">
<script src="/_utils/script/jquery.js" type="text/javascript"></script>
<script src="/_utils/script/jquery.couch.js" type="text/javascript"></script>
<script src="../../script/raphael-min.js" type="text/javascript"></script>
<script src="../../script/popup.js" type="text/javascript"></script>
<script type="text/javascript">
function getdoc( docID ){
$.couch.db("secreton-dev").openDoc( docID, {
success:function( doc ) {
var min = doc.genes[0].begin ;
var max = 0;
for( var i = 0 ;i<doc.genes.length ; i++ ){
var beg = doc.genes[i].begin ;
var end = doc.genes[i].end ;
if(beg<min){min = beg;}
if(end>max){max = end;}
}
//var width = $("#genes_schema").attr("width");
//console.log(["width", width] );
var paper_l = $("#genes_schema").width();
var paper_h = 250;
var genome_offset = 45;
var genes_offset= 10;
var coef = ( paper_l - (genome_offset+genes_offset)*2 ) / ( max - min );
var genome_orig = min;
var Y_genome = 55 ;
Raphael.fn.draw_genome = function(){
var genome_l = paper_l -(2* genome_offset);
return this.path( ["M", genome_offset , Y_genome, "h", genome_l ,"a25,5 -1 0,1 0,5h",(-1*(genome_l)),"a25,5 0 0,1 0,-5z" ]).attr({fill: "#aaa", stroke:"#aaa", "stroke-width":"1"} );
};
var Gene = function Gene( gene_info ){
var g_arrow = paper.draw_gene(gene_info);