MAJ terminée. Nous sommes passés en version 14.6.2 . Pour consulter les "releases notes" associées c'est ici :

https://about.gitlab.com/releases/2022/01/11/security-release-gitlab-14-6-2-released/
https://about.gitlab.com/releases/2022/01/04/gitlab-14-6-1-released/

Commit c9519b6c authored by Thonier Florian's avatar Thonier Florian
Browse files

Merge remote-tracking branch 'origin/dev' into feature-sct/4462_gitlab_ci_needs_after_gitlab_update

parents 1376ddb7 58821402
Pipeline #305223 passed with stages
in 59 minutes and 21 seconds
......@@ -373,6 +373,7 @@ ff45-browser-tutorial:
variables:
FIREFOX_VERSION: 45
chrome-browser-tutorial:
extends: .browser-tutorial-chrome
......@@ -413,6 +414,7 @@ server_tutorial_server:
FIREFOX_VERSION: 45
# Code quality
code_quality:
......@@ -528,6 +530,7 @@ ff45-server-functional:
# Benchmark
.benchmark-algo:
......
......@@ -64,30 +64,43 @@ build_cypress_image:
functional_browser_cypress_open:
# Need to create a symbolic link; but allow to directly see result
# Usefull for fast debugging; allow to launch script one by one
cypress open --env workdir=$(PWD),host=local
rm -r cypress
ln -s browser/test/cypress
cypress open --env workdir=../,host=localhost
functional_browser_cypress:
docker run \
-v $(PWD)/browser/test/cypress:/app/cypress \
-v $(PWD)/browser/test/data/:/app/cypress/fixtures/data/ \
-v $(PWD)/doc/:/app/cypress/fixtures/doc/ \
-v $(PWD):/app/vidjil \
-v "$(PWD)/docker/ci/cypress_script.bash":"/app/script.bash" \
-v "$(PWD)/docker/ci/cypress.json":"/app/cypress.json" \
--env BROWSER=electron --env HOST=local "vidjilci/cypress_with_browsers:latest" bash script.bash
-v `pwd`/browser/test/cypress:/app/cypress \
-v `pwd`/browser/test/data/:/app/cypress/fixtures/data/ \
-v `pwd`/doc/:/app/cypress/fixtures/doc/ \
-v `pwd`/demo/:/app/cypress/fixtures/demo/ \
-v `pwd`:/app/vidjil \
-v "`pwd`/docker/ci/cypress_script.bash":"/app/script.bash" \
-v "`pwd`/docker/ci/script_preprocess.bash":"/app/script_preprocess.bash" \
-v "`pwd`/docker/ci/cypress.json":"/app/cypress.json" \
--env BROWSER=electron --env HOST=localhost "vidjilci/cypress_with_browsers:latest" bash script.bash
functional_server_cypress_open:
cypress open --env workdir=$(PWD),host=local --project ./server/web2py/applications/vidjil/tests
ln -sf server/web2py/applications/vidjil/tests/cypress/ .
rm -r cypress/fixtures cypress/plugins cypress/support || true
ln -sf ../../../../../../browser/test/cypress/fixtures cypress/fixtures
ln -sf ../../../../../../browser/test/cypress/plugins cypress/plugins
ln -sf ../../../../../../browser/test/cypress/support cypress/support
cypress open --env workdir=../,host=local
functional_server_cypress:
# Need to have a local server deploy with the ci data integrated
docker run \
-v $(PWD)/server/web2py/applications/vidjil/tests/cypress:/app/cypress \
-v $(PWD)/browser/test/data/:/app/cypress/fixtures/data/ \
-v $(PWD)/doc/:/app/cypress/fixtures/doc/ \
-v $(PWD):/app/vidjil \
-v "$(PWD)/docker/ci/cypress_script.bash":"/app/script.bash" \
-v "$(PWD)/docker/ci/cypress.json":"/app/cypress.json" \
-v `pwd`/browser/test/cypress:/app/cypress \
-v `pwd`/browser/test/data/:/app/cypress/fixtures/data/ \
-v `pwd`/doc/:/app/cypress/fixtures/doc/ \
-v `pwd`/demo/:/app/cypress/fixtures/demo/ \
-v `pwd`:/app/vidjil \
-v "`pwd`/docker/ci/cypress_script.bash":"/app/script.bash" \
-v "`pwd`/docker/ci/script_preprocess.bash":"/app/script_preprocess.bash" \
-v "`pwd`/docker/ci/cypress.json":"/app/cypress.json" \
--network="host" \
--env BROWSER=electron --env HOST=local "vidjilci/cypress_with_browsers:latest" bash script.bash
......
.install-algo-dependencies:
before_script:
- apt-get update
- apt-get install -y time valgrind python2.7 python3 wget tar
- apt-get install -y time valgrind python2.7 python3 wget tar make zlib1g-dev
- ln -sf /usr/bin/python2.7 /usr/bin/python
.testing-compilers:
......@@ -32,13 +32,10 @@
CC: gcc
.testing-clang:
variables:
COMPILER_PKG: "clang"
COMPILER_CPP: "clang++"
COMPILER_C: "clang"
VERSION: $CLANG_VERSION
CXX: clang++
CC: clang
extends:
- .testing-compilers
- .installing-compiler # Overrides the before_script to install the compiler
.installing-testing-gcc:
variables:
......@@ -147,72 +144,62 @@ test_gcc11_release:
- .testing_various_compilers_release
test_clang34_manual:
image: debian:8-slim
variables:
CLANG_VERSION: "3.4"
image: silkeh/clang:3.4
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang34_release:
image: debian:8-slim
variables:
CLANG_VERSION: "3.4"
image: silkeh/clang:3.4
extends:
- .testing-clang
- .testing_various_compilers_release
test_clang4_manual:
image: debian:8-slim
variables:
CLANG_VERSION: "4.0"
image: silkeh/clang:4
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang4_release:
image: debian:8-slim
variables:
CLANG_VERSION: "4.0"
image: silkeh/clang:4
extends:
- .testing-clang
- .testing_various_compilers_release
test_clang6_manual:
image: debian:8-slim
variables:
CLANG_VERSION: "6.0"
image: silkeh/clang:6
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang6_release:
image: debian:8-slim
variables:
CLANG_VERSION: "6.0"
image: silkeh/clang:6
extends:
- .testing-clang
- .testing_various_compilers_release
test_clang7_manual:
image: debian:10-slim
variables:
CLANG_VERSION: "7"
image: silkeh/clang:7
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang7_release:
image: debian:10-slim
variables:
CLANG_VERSION: "7"
image: silkeh/clang:7
extends:
- .testing-clang
- .testing_various_compilers_release
test_clang11_manual:
image: debian:bullseye-slim
variables:
CLANG_VERSION: "11"
image: silkeh/clang:11
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang11_release:
image: debian:bullseye-slim
variables:
CLANG_VERSION: "11"
image: silkeh/clang:11
extends:
- .testing-clang
- .testing_various_compilers_release
test_clang12_manual:
image: silkeh/clang:12
extends:
- .testing-clang
- .testing_various_compilers_manual
test_clang12_release:
image: silkeh/clang:12
extends:
- .testing-clang
- .testing_various_compilers_release
......@@ -165,6 +165,7 @@
overflow-y: auto;
min-height : 130px;
margin-top: 1px;
max-height: 500px;
}
#segmenter {
......
......@@ -2416,6 +2416,7 @@ span .end-codon {
overflow-y: auto;
min-height: 130px;
margin-top: 1px;
max-height: 500px;
}
#segmenter {
display: flex;
......
......@@ -2416,6 +2416,7 @@ span .end-codon {
overflow-y: auto;
min-height: 130px;
margin-top: 1px;
max-height: 500px;
}
#segmenter {
display: flex;
......
......@@ -86,7 +86,7 @@
Data file (.vidjil):<br />
<input id="upload_json" type="file" name="json" /></br>
<p class='help'>The .vidjil file stores a set of clones on several points.</p>
<p class='help'>The .vidjil file stores a set of clonotypes on several points.</p>
Analysis file (.analysis, optional):<br />
<input id="upload_pref" type="file" name="pref" /></br>
......@@ -109,7 +109,7 @@
<div id="add_clone_menu">
<span class="closeButton" onclick="cancel();">X</span>
<h2>Add clones from sequences</h2>
<h2>Add clonotypes from sequences</h2>
<textarea id="addclone_input" placeholder="Sequence(s) (Fasta)"></textarea>
......@@ -159,7 +159,7 @@
</div>
<div class="menu_box devel-mode">
<a class="buttonSelector" id="add_clones" onclick="javascript:showAddManualCloneMenu()">add
clones from sequences</a>
clonotypes from sequences</a>
</div>
<!--<a class="buttonSelector" onclick="javascript:m.resetAnalysis()">reset analysis</a> -->
<!--<a class="buttonSelector" onclick="javascript:reset()">reset all</a> -->
......@@ -173,11 +173,11 @@
<a class="buttonSelector" id="export_analysis" onclick="javascript:m.saveAnalysis()">export analysis</a>
<a class="buttonSelector" id="export_svg1" onclick="javascript:m.exportViewToPNG(document.querySelector('#visu2_svg'))">export top graph (PNG)</a>
<a class="buttonSelector" id="export_svg2" onclick="javascript:m.exportViewToPNG(document.querySelector('#visu_svg'))">export bottom graph (PNG)</a>
<a class="buttonSelector" id="export_csv" onclick="javascript:m.exportCSV()">export csv (visible clones)</a>
<a class="buttonSelector" id="export_fasta" onclick="javascript:m.exportFasta()">export fasta (selected clones)</a>
<a class="buttonSelector" id="export_airr" onclick="javascript:m.exportCloneAs('airr')">export AIRR (selected clones)</a>
<a class="buttonSelector devel-mode" id="export_json" onclick="javascript:m.exportCloneAs('json')">export JSON (selected clones)</a>
<a class="buttonSelector disabledClass" id="export_fasta_align" onclick="javascript:segment.exportAlignFasta()">export aligned fasta (selected clones)</a>
<a class="buttonSelector" id="export_csv" onclick="javascript:m.exportCSV()">export csv (visible clonotypes)</a>
<a class="buttonSelector" id="export_fasta" onclick="javascript:m.exportFasta()">export fasta (selected clonotypes)</a>
<a class="buttonSelector" id="export_airr" onclick="javascript:m.exportCloneAs('airr')">export AIRR (selected clonotypes)</a>
<a class="buttonSelector devel-mode" id="export_json" onclick="javascript:m.exportCloneAs('json')">export JSON (selected clonotypes)</a>
<a class="buttonSelector disabledClass" id="export_fasta_align" onclick="javascript:segment.exportAlignFasta()">export aligned fasta (selected clonotypes)</a>
</div>
<div class="menu_box devel-mode">
......@@ -194,7 +194,7 @@
<a class="buttonSelector" onclick="m.restoreClusters();">revert to previous clusters</a>
</div>
<div class="menu_box">
<a id="clusterBy_selected" class="buttonSelector" onclick="m.merge();">cluster selected clones</a>
<a id="clusterBy_selected" class="buttonSelector" onclick="m.merge();">cluster selected clonotypes</a>
<a id="clusterBy_5" class="buttonSelector" onclick="m.clusterBy(function(id){return m.clone(id).getGene(5)});">cluster by V/5' </a>
<a id="clusterBy_3" class="buttonSelector" onclick="m.clusterBy(function(id){return m.clone(id).getGene(3)});">cluster by J/3' </a>
<a id="clusterBy_cdr3" class="buttonSelector" onclick="m.clusterBy(function(id){return m.clone(id).getSegAASequence('junction')});">cluster by CDR3 </a>
......@@ -233,8 +233,8 @@
</div>
<div class="menu_box">
<div id="filter_switch_sample"
title="Hide clones that are not present in the current sample">
<input id="filter_switch_sample_check" type="checkbox"></input> Focus on clones of one
title="Hide clonotypes that are not present in the current sample">
<input id="filter_switch_sample_check" type="checkbox"></input> Focus on clonotypes of one
sample
</div>
</div>
......@@ -288,7 +288,7 @@
</label>
</div>
<div class="menu_box">
N regions in clone names</br>
N regions in clonotype names</br>
<label for="menuCloneNot_nucleotide_number" class="buttonSelector"
onclick="m.changeCloneNotation('nucleotide_number', true, true)">
<input id="menuCloneNot_nucleotide_number" type="radio" name="show_name"
......@@ -618,13 +618,13 @@
<div id="aligner-stats" class="stats"><span title="">
<span class="stats_content"></span>
<span id="focus_selected" class="button" title="Focus on selected Clones (ctrl+z)" >
<span id="focus_selected" class="button" title="Focus on selected clonotypes (ctrl+z)" >
<i class="icon-eye"></i></span>
<span id="hide_selected" class="button" title="Hide selected Clones (shift+z)">
<span id="hide_selected" class="button" title="Hide selected clonotypes (shift+z)">
<i class="icon-eye-off"></i></span>
<span class="button" id="reset_focus" title="Reset Focus/Hide filters (z)">
<span class="button" id="reset_focus" title="Reset focus / Hide filters (z)">
<i class="icon-cancel-circled-outline"></i></span>
<span class="button" id="star_selected" title="Tag selected clones">
<span class="button" id="star_selected" title="Tag selected clonotypes">
<i id="tag_icon__multiple" class="icon-star-2"></i></span>
</div>
</div>
......@@ -647,13 +647,13 @@
<template id="aligner-F">
<div class="seq-fixed cloneName">
<span class="nameBox" title="clone name">
<span class="delBox"><i class="icon-cancel" title="Unselect this clone"></i></span>
<span class="nameBox" title="clonotype name">
<span class="delBox"><i class="icon-cancel" title="Unselect this clonotype"></i></span>
<span class="nameBox2"></span>
</span>
<span class="axisBox"></span>
<span class="starBox" id="color60"><i id="tag_icon_60" title="clone_tag" class="icon-star-2"></i></span>
<span class="infoBox"><i class="icon-info" title="clone information"></i></span>
<span class="infoBox"><i class="icon-info" title="clonotype information"></i></span>
</div>
</template>
......
......@@ -229,10 +229,10 @@ Aligner.prototype = {
// Focus/hide/label
document.getElementById("focus_selected").onclick = function () { self.m.filter.add("Clone", "focus", self.m.getSelected()); };
document.getElementById("hide_selected").onclick = function () { self.m.filter.add("Clone", "hide", self.m.getSelected()); };
document.getElementById("reset_focus").onclick = function () { self.m.filter.remove("Clone", "focus")
self.m.filter.remove("Clone", "hide") };
document.getElementById("focus_selected").onclick = function () { self.m.filter.add("Clonotype", "focus", self.m.getSelected()); };
document.getElementById("hide_selected").onclick = function () { self.m.filter.add("Clonotype", "hide", self.m.getSelected()); };
document.getElementById("reset_focus").onclick = function () { self.m.filter.remove("Clonotype", "focus")
self.m.filter.remove("Clonotype", "hide") };
document.getElementById("star_selected").onclick = function (e) {
if (m.getSelected().length > 0) { self.m.openTagSelector(m.getSelected(), e); }};
document.getElementById("cluster").onclick = function () { self.m.merge(); };
......@@ -871,7 +871,7 @@ Aligner.prototype = {
if (length) t += length ;
if (nb_clones_not_constant) t += '+' + nb_clones_not_constant;
t += " clone" + (length+nb_clones_not_constant>1 ? "s" : "") + ", ";
t += " clonotype" + (length+nb_clones_not_constant>1 ? "s" : "") + ", ";
t += this.m.toStringThousands(sumRawReads) + " read" + (sumRawReads>1 ? "s" : "");
......@@ -913,8 +913,8 @@ Aligner.prototype = {
$("#hide_selected").css("display", "none")
}
if (this.m.filter.check("Clone", "focus") != -1 ||
this.m.filter.check("Clone", "hide") != -1)
if (this.m.filter.check("Clonotype", "focus") != -1 ||
this.m.filter.check("Clonotype", "hide") != -1)
$("#reset_focus").css("display", "")
else
$("#reset_focus").css("display", "none")
......
......@@ -242,6 +242,7 @@ Axis.prototype = {
this.step = Math.max(nice.step, this.min_step)
this.precision = nice_number_digits(this.step, 1)
this.scale.nice_min = nice.min
var l = nice.min.toFixed(this.precision)
if (l == 0) l = "0"
......@@ -255,13 +256,15 @@ Axis.prototype = {
//add labels for each steps between min and max
if (this.scale.reverse){
for (var i = this.scale.nice_max;
this.scale.nice_min.toFixed(this.precision) <= (i+this.step/2).toFixed(this.precision);
parseFloat(this.scale.nice_min.toFixed(this.precision)) <= parseFloat((i+this.step/2).toFixed(this.precision));
i=i-this.step){
this.addScaleLabel(i, "linearScale")
labelCount++
}
}else{
for (var j = this.scale.nice_min; j < this.scale.nice_max+this.step; j+= this.step){
for (var j = this.scale.nice_min;
parseFloat(j.toFixed(this.precision)) <= parseFloat(this.scale.nice_max.toFixed(this.precision));
j+= this.step){
this.addScaleLabel(j, "linearScale")
labelCount++
}
......
......@@ -76,6 +76,8 @@ AXIS_SCATTERPLOT = ["V/5' gene",
"Primers gap",
"V/5' del'",
"J/3' del'",
"V/5' length",
"J/3' length",
"[cloneDB] Hits (sample)",
"[cloneDB] Hits (set)"
]
......@@ -96,7 +98,7 @@ AXIS_ALIGNER = [
AXIS_COLOR = [
"Size",
"Tag",
"Clone",
"Clonotype",
"CDR3",
"Locus",
"N length",
......@@ -117,7 +119,7 @@ AXIS_DEFAULT = {
doc: "",
fct: function(clone) {return clone.top},
},
"Clone": {
"Clonotype": {
doc: "",
labels: function(){
var l = {}
......@@ -191,14 +193,14 @@ AXIS_DEFAULT = {
autofill: false
},
"Sequence length" : {
doc: "length of the clone consensus sequence or representative sequence provided by the analysis software",
doc: "length of the consensus sequence of the clonotype",
fct: function(clone) {return clone.getSequenceLength()},
autofill: true,
min_step: 1,
color: function(t,c){ return d3.piecewise(d3.interpolateRgb.gamma(2.2), ["#00AAFF", "#00EE00", "red"])(t) },
},
"Read length" : {
doc: "average length of the reads belonging to each clone",
doc: "average length of the reads belonging to each clonotype",
labels: {
"?": {text:"?", side: "right"}
},
......@@ -212,7 +214,7 @@ AXIS_DEFAULT = {
color: function(t,c){ return d3.piecewise(d3.interpolateRgb.gamma(2.2), ["#00AAFF", "#00EE00", "red"])(t) },
},
"GC content" : {
doc: "%GC content of the consensus sequence of each clone",
doc: "%GC content of the consensus sequence of each clonotype",
fct: function(clone) {return clone.getGCContent()},
autofill: true,
},
......@@ -305,7 +307,7 @@ AXIS_DEFAULT = {
autofill : false
},
"Coverage": {
doc: "ratio of the length of the clone consensus sequence to the median read length of the clone",
doc: "ratio of the length of the clonotype consensus sequence to the median read length of the clonotype",
// "Coverage between .85 and 1.0 (or more) are good values",
fct: function(clone){return clone.coverage},
scale: {
......@@ -322,7 +324,7 @@ AXIS_DEFAULT = {
autofill: true
},
"Size" : {
doc: "ratio of the number of reads of each clone to the total number of reads in the selected locus",
doc: "ratio of the number of reads of each clonotype to the total number of reads in the selected locus",
fct : function(clone,t){return clone.getSize(t)},
scale: { mode: "log"},
color: function(t,c){ return d3.piecewise(d3.interpolateRgb.gamma(2.2), ["#00AAFF", "#00EE00", "red"])(t) },
......@@ -330,7 +332,7 @@ AXIS_DEFAULT = {
pretty: function(size) {return createClassedSpan("sizeBox sixChars", (self.m ? self.m : self).getStrAnySize(undefined, size)) },
},
"Size (other)" : {
doc: "ratio of the number of reads of each clone to the total number of reads in the selected locus, on the previously selected sample",
doc: "ratio of the number of reads of each clonotype to the total number of reads in the selected locus, on the previously selected sample",
fct : function(clone){return clone.getSize(m.tOther)},
scale: {
mode: "log",
......@@ -339,7 +341,7 @@ AXIS_DEFAULT = {
autofill: true,
},
"Number of samples" : {
label: "number of samples sharing each clone",
label: "number of samples sharing each clonotype",
fct : function(clone){return clone.getNumberNonZeroSamples()},
scale: {
mode: "linear",
......@@ -363,6 +365,22 @@ AXIS_DEFAULT = {
fct: function(clone) {return clone.getDeletion('3', 'delLeft')},
autofill: true
},
"V/5' length": {
doc: "length of the V/5' gene in the consensus sequence",
fct: function(clone) {
var feature = clone.getSegFeature('5')
return feature.stop - (feature.start ? feature.start : 0)
},
autofill: true
},
"J/3' length": {
doc: "length of the J/3' gene in the consensus sequence",
fct: function(clone) {
var feature = clone.getSegFeature('3')
return (feature.stop ? feature.stop : clone.sequence.length) - feature.start
},
autofill: true
},
"[cloneDB] Hits (sample)": {
doc: "number of sample sharing clones in cloneDB",
scale: {
......@@ -374,147 +392,73 @@ AXIS_DEFAULT = {
//hide : (typeof config === 'undefined' || ! config.clonedb),
},
"[cloneDB] Hits (set)": {
doc: "number of patients/runs/sets sharing clones in cloneDB",
doc: "number of patients/runs/sets sharing clonotypes in cloneDB",
scale: {
"mode": "linear",
"min": 0
},
fct: function(clone) {return clone.numberSampleSetInCloneDB()},
autofill: true,
isInAligner: false
autofill: true
//hide : (typeof config === 'undefined' || ! config.clonedb),
},
/* "tsneX": {
label: "distance (X)",
axis: new FloatAxis(this.m),
fct: function(clone){
var r = self.gridSizeH/self.gridSizeW;
var k=1;
var yMax = self.m.similarity_builder.yMax
if (yMax > r) k = r/yMax
return k*clone.tsne[0] + (1-k)/2
},
log: false,
min: 0,
max: 1,
hide : true,
display_label : false
},
"tsneY": {
label: "distance (Y)",
axis: new FloatAxis(this.m),
fct: function(clone){
var r = self.gridSizeH/self.gridSizeW;
var k=1;
var yMax = self.m.similarity_builder.yMax
if (yMax > r) k = r/yMax
return k*clone.tsne[1]
},
log: false,
min: 0,
max: function(){return self.gridSizeH/self.gridSizeW},
hide : true,
display_label : false
},
"tsneX_system": {
label: "distance (X), by locus",
axis: new FloatAxis(this.m),
fct: function(clone){
var r = self.gridSizeH/self.gridSizeW;
var k=1;
var yMax = self.m.similarity_builder.system_yMax[clone.get("germline")]
if (yMax > r) k = r/yMax
return k*clone.tsne_system[0] + (1-k)/2
},
log: false,
min: 0,
max: 1,
hide : true,
display_label : false
},
"tsneY_system": {
label: "distance (Y), by locus",
axis: new FloatAxis(this.m),
fct: function(clone){
var r = self.gridSizeH/self.gridSizeW;
var k=1;
var yMax = self.m.similarity_builder.system_yMax[clone.get("germline")]
if (yMax > r) k = r/yMax
return k*clone.tsne_system[1]
},
log: false,
min: 0,
max: function(){return self.gridSizeH/self.gridSizeW},
hide : true,
display_label : false
},
"test1": {
name: "test1",
labels: {
"not productive": {text:"not productive", side: "left"},
"no CDR3 detected": {text:"no CDR3 detected", side: "left"},
"productive": {text:"productive", side: "right", type: "bold"},
},
"TSNEX": {
doc: "",
fct: function(clone) {
if (clone.germline == m.germlineV.system) return clone.getGene("5", false)
return clone.getProductivityName();
if (clone.tsne )return clone.tsne[0]
return undefined
},
germline: "multi",
autofill: true,
color: {
fct : function(t){return d3.interpolateRainbow(t)},
offset: 0.5
}
},
"test2": {
name: "test2",
labels: {
"a": {text:"pok", side: "right", sub :{