Commit a67d6108 authored by Marc Duez's avatar Marc Duez

Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/vidjil/vidjil into rework_data

parents 2edf58e1 31bbba7b
......@@ -25,7 +25,7 @@ test_with_fuse:
unit: all
@echo "*** Launching unit tests..."
make COVERAGE="$(COVERAGE_OPTION)" -C $(VIDJIL_ALGO_SRC)/tests
@echo "*** All .should_get tests passed"
@echo "*** All unit tests passed"
pytests:
@echo "*** Launching python tests..."
......
......@@ -3,11 +3,15 @@
Germline::Germline(string _code, char _shortcut,
string f_rep_5, string f_rep_4, string f_rep_3,
string seed,
int _delta_min, int _delta_max)
{
code = _code ;
shortcut = _shortcut ;
index = 0 ;
affect_5 = "V" ;
affect_4 = "";
affect_3 = "J" ;
rep_5 = Fasta(f_rep_5, 2, "|", cout);
rep_4 = Fasta(f_rep_4, 2, "|", cout);
......@@ -16,22 +20,23 @@ Germline::Germline(string _code, char _shortcut,
delta_min = _delta_min ;
delta_max = _delta_max ;
build_index(seed);
stats.setLabel(code);
}
Germline::Germline(string _code, char _shortcut,
Fasta _rep_5, Fasta _rep_4, Fasta _rep_3,
string seed,
int _delta_min, int _delta_max)
{
code = _code ;
shortcut = _shortcut ;
index = 0 ;
// affect_5 = KmerAffect("", "V", 0) ;
// affect_3 = KmerAffect("", "J", 0) ;
affect_5 = "V" ;
affect_4 = "" ;
affect_3 = "J" ;
rep_5 = _rep_5 ;
rep_4 = _rep_4 ;
......@@ -40,23 +45,41 @@ Germline::Germline(string _code, char _shortcut,
delta_min = _delta_min ;
delta_max = _delta_max ;
build_index(seed);
stats.setLabel(code);
}
void Germline::build_index(string seed)
void Germline::new_index(string seed)
{
bool rc = true ;
index = KmerStoreFactory::createIndex<KmerAffect>(seed, rc);
index->insert(rep_5, "V"); // affect_5);
index->insert(rep_3, "J"); // affect_3);
update_index();
}
void Germline::use_index(IKmerStore<KmerAffect> *_index)
{
index = _index;
update_index();
}
void Germline::update_index()
{
index->insert(rep_5, affect_5);
if (affect_4.size())
index->insert(rep_4, affect_4);
index->insert(rep_3, affect_3);
cout << " --- index " << index << " updated " << affect_5 << "/" << affect_4 << "/" << affect_3 << endl;
}
Germline::~Germline()
{
delete index;
if (index)
delete index;
}
ostream &operator<<(ostream &out, const Germline &germline)
......@@ -91,7 +114,6 @@ MultiGermline::MultiGermline(string f_germlines_json)
Germline *germline;
germline = new Germline("TRG", 'G',
rep_5, rep_4, rep_3,
seed,
delta_min, delta_max);
germlines.push_back(germline);
......@@ -109,12 +131,52 @@ void MultiGermline::insert(Germline *germline)
germlines.push_back(germline);
}
void MultiGermline::load_default_set(string path)
void MultiGermline::build_default_set(string path)
{
Germline *germline;
germline = new Germline("TRG", 'G', path + "/TRGV.fa", "", path + "/TRGJ.fa", -10, 20);
germline->new_index("#####-#####");
germlines.push_back(germline);
germline = new Germline("IGH", 'H', path + "/IGHV.fa", path + "/IGHD.fa", path + "/IGHJ.fa", 0, 80);
germline->new_index("######-######");
germlines.push_back(germline);
}
void MultiGermline::load_standard_set(string path)
{
germlines.push_back(new Germline("TRG", 'G', path + "/TRGV.fa", "", path + "/TRGJ.fa", "#####-#####", -10, 20));
germlines.push_back(new Germline("IGH", 'H', path + "/IGHV.fa", path + "/IGHD.fa", path + "/IGHJ.fa", "######-######", 0, 80));
germlines.push_back(new Germline("TRA", 'A', path + "/TRAV.fa", "", path + "/TRAJ.fa", -10, 20));
germlines.push_back(new Germline("TRB", 'B', path + "/TRBV.fa", path + "/TRBD.fa", path + "/TRBJ.fa", -10, 20));
germlines.push_back(new Germline("TRG", 'G', path + "/TRGV.fa", "", path + "/TRGJ.fa", -10, 20));
germlines.push_back(new Germline("TRD", 'D', path + "/TRDV.fa", path + "/TRDD.fa", path + "/TRDJ.fa", 0, 80));
germlines.push_back(new Germline("IGH", 'H', path + "/IGHV.fa", path + "/IGHD.fa", path + "/IGHJ.fa", 0, 80));
germlines.push_back(new Germline("IGK", 'K', path + "/IGKV.fa", "", path + "/IGKJ.fa", -10, 20));
germlines.push_back(new Germline("IGL", 'L', path + "/IGLV.fa", "", path + "/IGLJ.fa", -10, 20));
}
void MultiGermline::insert_in_one_index(IKmerStore<KmerAffect> *_index)
{
for (list<Germline*>::const_iterator it = germlines.begin(); it != germlines.end(); ++it)
{
Germline *germline = *it ;
germline->affect_5 = string(1, germline->shortcut) + "-" + germline->code + "V";
if (germline->rep_4.size())
germline->affect_4 = string(1, 14 + germline->shortcut) + "-" + germline->code + "D";
germline->affect_3 = string(1, tolower(germline->shortcut)) + "-" + germline->code + "J";
germline->use_index(_index) ;
}
}
void MultiGermline::build_with_one_index(string seed)
{
bool rc = true ;
index = KmerStoreFactory::createIndex<KmerAffect>(seed, rc);
insert_in_one_index(index);
}
void MultiGermline::out_stats(ostream &out)
{
......
......@@ -12,7 +12,7 @@ using namespace std;
class Germline {
private:
void build_index(string seed);
void update_index();
public:
/*
......@@ -26,12 +26,10 @@ class Germline {
Germline(string _code, char _shortcut,
string f_rep_5, string f_rep_4, string f_rep_3,
string seed,
int _delta_min, int _delta_max);
Germline(string _code, char _shortcut,
Fasta _rep_5, Fasta _rep_4, Fasta _rep_3,
string seed,
int _delta_min, int _delta_max);
~Germline();
......@@ -39,9 +37,15 @@ class Germline {
string code ;
char shortcut ;
void new_index(string seed);
void use_index(IKmerStore<KmerAffect> *index);
// KmerAffect affect_5 ;
// KmerAffect affect_3 ;
string affect_5 ;
string affect_4 ;
string affect_3 ;
Fasta rep_5 ;
Fasta rep_4 ;
Fasta rep_3 ;
......@@ -63,12 +67,19 @@ class MultiGermline {
public:
list <Germline*> germlines;
// A unique index can be used
IKmerStore<KmerAffect> *index;
MultiGermline();
MultiGermline(string f_germlines_json);
~MultiGermline();
void insert(Germline *germline);
void load_default_set(string path);
void build_default_set(string path);
void load_standard_set(string path);
void insert_in_one_index(IKmerStore<KmerAffect> *_index);
void build_with_one_index(string seed);
void out_stats(ostream &out);
};
......
......@@ -75,7 +75,7 @@ KmerAffect::KmerAffect(const KmerAffect &ka) {
affect = ka.affect;
}
KmerAffect::KmerAffect(const string &kmer, const string &label,
KmerAffect::KmerAffect(const string &label,
int strand) {
affect.c = label[0];
if (strand == 1)
......@@ -131,7 +131,7 @@ KmerAffect KmerAffect::getUnknown() {
}
bool KmerAffect::isAmbiguous() const {
return affect_strand(affect) == 1 && affect_char(affect) == 0;
return affect_strand(affect) == 1 && affect_char(affect) == 1;
}
bool KmerAffect::isUnknown() const {
......@@ -177,7 +177,7 @@ KmerStringAffect::KmerStringAffect(const KmerStringAffect &ksa):
label(ksa.label),strand(ksa.strand){}
KmerStringAffect::KmerStringAffect(const string &kmer, const string &label,
KmerStringAffect::KmerStringAffect(const string &label,
int strand) {
this->label = label;
this->strand = strand;
......
......@@ -69,7 +69,7 @@ public:
* Construct an affectation as stated by the parameters
* @post affect_strand(affect) == strand AND affect_char(affect) == kmer[0]
*/
KmerAffect(const string &kmer, const string &label="", int strand=1);
KmerAffect(const string &label, int strand=1);
/**
* Add another affectation to the current one.
* @post The current affectation is not modified if the parameter is the same
......@@ -142,17 +142,17 @@ ostream &operator<<(ostream &os, const KmerAffect &kmer);
/**
* Constant defining the unknown affectation (not known yet)
*/
const KmerAffect AFFECT_UNKNOWN = KmerAffect("", "\0", 0);
const KmerAffect AFFECT_UNKNOWN = KmerAffect("\0", 0);
/**
* Constant defining the ambiguous affectation (many possibilities)
*/
const KmerAffect AFFECT_AMBIGUOUS = KmerAffect("", "\0", 1);
const KmerAffect AFFECT_AMBIGUOUS = KmerAffect("\1", 1);
const KmerAffect AFFECT_V = KmerAffect("", "V", 1);
const KmerAffect AFFECT_J = KmerAffect("", "J", 1);
const KmerAffect AFFECT_V = KmerAffect("V", 1);
const KmerAffect AFFECT_J = KmerAffect("J", 1);
const KmerAffect AFFECT_V_BWD = KmerAffect("", "V", -1);
const KmerAffect AFFECT_J_BWD = KmerAffect("", "J", -1);
const KmerAffect AFFECT_V_BWD = KmerAffect("V", -1);
const KmerAffect AFFECT_J_BWD = KmerAffect("J", -1);
////////////////////////////////////////////////////////////////////////////////////////////////////
......@@ -176,7 +176,7 @@ public:
* Construct an affectation as stated by the parameters
* @post affect_strand(affect) == strand AND affect_char(affect) == kmer[0]
*/
KmerStringAffect(const string &kmer, const string &label="", int strand=1);
KmerStringAffect(const string &label, int strand=1);
/**
* Add another affectation to the current one.
* @post The current affectation is not modified if the parameter is the same
......@@ -244,6 +244,6 @@ bool operator>=(const KmerStringAffect &k1, const KmerStringAffect &k2);
ostream &operator<<(ostream &os, const KmerStringAffect &kmer);
const KmerStringAffect KSA_UNKNOWN = KmerStringAffect();
const KmerStringAffect KSA_AMBIGUOUS = KmerStringAffect("", "", 2);
const KmerStringAffect KSA_AMBIGUOUS = KmerStringAffect("", 2);
#endif
......@@ -26,7 +26,7 @@
Kmer::Kmer():count(0) {}
Kmer::Kmer(const string &kmer, const string &label, int strand) {
Kmer::Kmer(const string &label, int strand) {
count = 1;
}
......
......@@ -16,7 +16,12 @@ public:
unsigned int count;
Kmer();
Kmer(const seqtype &kmer, const string &label="", int strand=1);
/**
* This constructor is used via a IKmerStore<Kmer> index (hence the argument list)
*/
Kmer(const string &label, int strand=1);
Kmer &operator+=(const Kmer &);
static bool hasRevcompSymetry();
} ;
......@@ -37,17 +42,19 @@ public:
virtual ~IKmerStore();
list< pair <T, string> > labels;
/**
* @param input: A single FASTA file
* @param label: label that must be associated to the given files
* @post All the sequences in the FASTA files have been indexed.
* @post All the sequences in the FASTA files have been indexed, and the label is stored in the list of labels
*/
void insert(Fasta& input, const string& label="");
/**
* @param input: A list of FASTA files
* @param label: label that must be associated to the given files
* @post All the sequences in the FASTA files have been indexed.
* @post All the sequences in the FASTA files have been indexed, and the label is stored in the list of labels
*/
void insert(list<Fasta>& input, const string& label="");
......@@ -163,6 +170,8 @@ void IKmerStore<T>::insert(Fasta& input,
for (int r = 0; r < input.size(); r++) {
insert(input.sequence(r), label);
}
labels.push_back(make_pair(T(label, 1), label)) ;
}
template<class T>
......@@ -178,10 +187,10 @@ void IKmerStore<T>::insert(const seqtype &sequence,
kmer = rc_kmer;
}
}
this->get(kmer) += T(kmer, label, strand);
this->get(kmer) += T(label, strand);
if (revcomp_indexed && ! T::hasRevcompSymetry()) {
seqtype rc_kmer = revcomp(kmer);
this->get(rc_kmer) += T(rc_kmer, label, -1);
this->get(rc_kmer) += T(label, -1);
}
}
}
......
......@@ -215,7 +215,7 @@ KmerSegmenter::KmerSegmenter(Sequence seq, MultiGermline *multigermline)
strand = 2;
}
computeSegmentation(strand, germline->delta_min, germline->delta_max, s);
computeSegmentation(strand, germline);
if (segmented)
{
......@@ -241,7 +241,7 @@ KmerSegmenter::~KmerSegmenter() {
delete kaa;
}
void KmerSegmenter::computeSegmentation(int strand, int delta_min, int delta_max, int s) {
void KmerSegmenter::computeSegmentation(int strand, Germline* germline) {
// Try to segment, computing 'Vend' and 'Jstart', and 'segmented'
// If not segmented, put the cause of unsegmentation in 'because'
......@@ -259,12 +259,13 @@ void KmerSegmenter::computeSegmentation(int strand, int delta_min, int delta_max
}
else
{
// Strand +
affect_infos max;
if (strand == 1)
max = kaa->getMaximum(AFFECT_V, AFFECT_J);
max = kaa->getMaximum(KmerAffect(germline->affect_5, 1),
KmerAffect(germline->affect_3, 1));
else
max = kaa->getMaximum(AFFECT_J_BWD, AFFECT_V_BWD);
max = kaa->getMaximum(KmerAffect(germline->affect_3, -1),
KmerAffect(germline->affect_5, -1));
if (! max.max_found) {
if ((strand == 1 && max.nb_before_left == 0)
......@@ -291,12 +292,12 @@ void KmerSegmenter::computeSegmentation(int strand, int delta_min, int delta_max
{
// Now we check the delta between Vend and right
if (Jstart - Vend < delta_min)
if (Jstart - Vend < germline->delta_min)
{
because = UNSEG_BAD_DELTA_MIN ;
}
if (Jstart - Vend > delta_max)
if (Jstart - Vend > germline->delta_max)
{
because = UNSEG_BAD_DELTA_MAX ;
}
......
......@@ -158,7 +158,7 @@ class KmerSegmenter : public Segmenter
int getSegmentationStatus() const;
private:
void computeSegmentation(int strand, int delta_min, int delta_max, int s);
void computeSegmentation(int strand, Germline* germline);
};
class FineSegmenter : public Segmenter
......
!LAUNCH: ../../vidjil -G ../../germline/IGH -r 5 -d ../../data/Stanford_S22.fasta ; cat out/vidjil.data | sh format-json.sh
$ Number of reads
1:"reads_total" : [ 13153 ] ,
1:"total" : [ 13153 ] ,
$ Number of segmented reads
1:"reads_segmented" : [ 13139 ] ,
1:"segmented" : [ 13139 ]
$ Most abundant window
1:"window" : "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", "size" : [ 8 ]
1:"id" : "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", "reads" : [ 8 ]
......@@ -4,7 +4,7 @@ $ Points list
f1:"point": [ "", "" ]
$ Most abundant window, twice, fused
f1:"window": "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", "id": .*, "size": [ 8, 8 ]
f1:"id": "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", .*"reads": [ 8, 8 ]
# Fails since 49046ca6b97, no more 'others'
$ Windows that are not in the top 50
......
......@@ -20,26 +20,26 @@ void testAffectAnalyser1() {
for (int i = 2; i < nb_seq-1; i++) {
// i starts at 2 because AAAA is not found: there is an ambiguity with
// AAAA coming from AAAACAAAACAAAAC or AAAAAAAAAAAAAAA
KAffect current_affect("", seq[2*i+1], 1);
KAffect current_affect(seq[2*i+1], 1);
TAP_TEST(kaa.count(current_affect) == 0, TEST_AA_COUNT, "");
TAP_TEST(ckaa.count(current_affect) == 0, TEST_COUNT_AA_COUNT, ckaa.count(current_affect));
TAP_TEST(kaa.first(current_affect) == (int)string::npos, TEST_AA_FIRST, "");
TAP_TEST(kaa.last(current_affect) == (int)string::npos, TEST_AA_LAST, "");
}
for (int i = 0; i < 2; i++) {
KAffect current_affect("", seq[2*i+1], 1);
KAffect current_affect(seq[2*i+1], 1);
TAP_TEST(kaa.count(current_affect) == 2, TEST_AA_COUNT, kaa.count(current_affect));
TAP_TEST(ckaa.count(current_affect) == 2, TEST_COUNT_AA_COUNT, ckaa.count(current_affect));
TAP_TEST(kaa.getAffectation(kaa.first(current_affect)) == current_affect, TEST_AA_GET_AFFECT, "");
TAP_TEST(kaa.getAffectation(kaa.last(current_affect)) == current_affect, TEST_AA_GET_AFFECT, "");
}
TAP_TEST(kaa.count(KAffect("", seq[2*(nb_seq-1)+1], 1)) == 1, TEST_AA_COUNT, "");
TAP_TEST((kaa.first(KAffect("", seq[2*(nb_seq-1)+1], 1))
== kaa.last(KAffect("", seq[2*(nb_seq-1)+1], 1)))
TAP_TEST(kaa.count(KAffect(seq[2*(nb_seq-1)+1], 1)) == 1, TEST_AA_COUNT, "");
TAP_TEST((kaa.first(KAffect(seq[2*(nb_seq-1)+1], 1))
== kaa.last(KAffect(seq[2*(nb_seq-1)+1], 1)))
== 1, TEST_AA_FIRST, "");
TAP_TEST(ckaa.max(forbidden) == KAffect("", "C lots of", 1)
|| ckaa.max(forbidden) == KAffect("", "G lots of", 1),
TAP_TEST(ckaa.max(forbidden) == KAffect("C lots of", 1)
|| ckaa.max(forbidden) == KAffect("G lots of", 1),
TEST_COUNT_AA_MAX, "max is " << ckaa.max(forbidden));
TAP_TEST(ckaa.max() == KAffect::getUnknown(),
......@@ -51,8 +51,8 @@ void testAffectAnalyser1() {
TAP_TEST(kaa.getDistinctAffectations().size() == 5, TEST_AA_GET_DISTINCT_AFFECT, "");
KAffect cAffect = KAffect("", seq[1], 1);
KAffect gAffect = KAffect("", seq[3], 1);
KAffect cAffect = KAffect(seq[1], 1);
KAffect gAffect = KAffect(seq[3], 1);
TAP_TEST(ckaa.countBefore(cAffect, 4) == 0, TEST_COUNT_AA_COUNT_BEFORE, "");
TAP_TEST(ckaa.countBefore(cAffect, 5) == 1, TEST_COUNT_AA_COUNT_BEFORE, "");
TAP_TEST(ckaa.countAfter(cAffect, 4) == 1, TEST_COUNT_AA_COUNT_AFTER, "");
......@@ -77,8 +77,8 @@ void testAffectAnalyser1() {
TAP_TEST(ckaa.lastMax(cAffect, gAffect) == 8, TEST_COUNT_AA_LAST_MAX, ckaa.lastMax(cAffect, gAffect));
// Test affectation with two affects that are not in the sequence
KAffect aAffect = KAffect("", seq[5], 1);
KAffect tAffect = KAffect("", seq[7], 1);
KAffect aAffect = KAffect(seq[5], 1);
KAffect tAffect = KAffect(seq[7], 1);
TAP_TEST(ckaa.firstMax(aAffect, tAffect) == -1, TEST_COUNT_AA_FIRST_MAX, "");
TAP_TEST(ckaa.lastMax(aAffect, tAffect) == - 1,
TEST_COUNT_AA_LAST_MAX, "");
......@@ -109,7 +109,7 @@ void testAffectAnalyser2() {
forbidden.insert(KAffect::getAmbiguous());
forbidden.insert(KAffect::getUnknown());
TAP_TEST(kaa.getAffectation(1) == KAffect("", seq[2*(nb_seq-1)+1], -1), TEST_AA_GET_AFFECT, "");
TAP_TEST(kaa.getAffectation(1) == KAffect(seq[2*(nb_seq-1)+1], -1), TEST_AA_GET_AFFECT, "");
TAP_TEST(kaa.count(kaa.getAffectation(1)) == 1, TEST_AA_GET_AFFECT, "");
TAP_TEST(ckaa.count(kaa.getAffectation(1)) == 1, TEST_COUNT_AA_COUNT, "");
TAP_TEST(kaa.getAffectation(0) == kaa.getAffectation(10 - k), TEST_AA_GET_AFFECT, "");
......@@ -120,7 +120,7 @@ void testAffectAnalyser2() {
TAP_TEST(kaa.getDistinctAffectations().size() == 3, TEST_AA_GET_DISTINCT_AFFECT, "");
TAP_TEST(ckaa.max(forbidden) == KAffect("", seq[2*(nb_seq-1)+1], -1),
TAP_TEST(ckaa.max(forbidden) == KAffect(seq[2*(nb_seq-1)+1], -1),
TEST_COUNT_AA_MAX, "max is " << ckaa.max(forbidden));
TAP_TEST(ckaa.max() == KAffect::getUnknown(),
......
......@@ -15,7 +15,8 @@ void testSegmentationBug1(int delta_min, int delta_max) {
Fasta seqJ("../../germline/TRGJ.fa");
Germline *germline ;
germline = new Germline("custom", 'x', seqV, seqV, seqJ, "##############", delta_min, delta_max);
germline = new Germline("custom", 'x', seqV, seqV, seqJ, delta_min, delta_max);
germline->new_index("##############");
MultiGermline *multi ;
multi = new MultiGermline();
......
......@@ -20,7 +20,8 @@ void testFineSegment()
Fasta data("../../data/Stanford_S22.fasta", 1, " ");
Germline *germline ;
germline = new Germline("IGH", 'G', seqV, seqD, seqJ, "####", 0, 50);
germline = new Germline("IGH", 'G', seqV, seqD, seqJ, 0, 50);
germline->new_index("####");
Sequence seq = data.read(2);
......@@ -70,9 +71,12 @@ void testSegmentOverlap()
Fasta data("../../data/bug-segment-overlap.fa", 1, " ");
Germline *germline1 ;
germline1 = new Germline("TRG", 'G', seqV, seqV, seqJ, "##########", -50, 50);
germline1 = new Germline("TRG", 'G', seqV, seqV, seqJ, -50, 50);
germline1->new_index("##########");
Germline *germline2 ;
germline2 = new Germline("TRG2", 'G', seqV, seqV, seqJ, "##########", -50, 50);
germline2 = new Germline("TRG2", 'G', seqV, seqV, seqJ, -50, 50);
germline2->new_index("##########");
MultiGermline *multi1 ;
multi1 = new MultiGermline();
......@@ -103,7 +107,8 @@ void testSegmentationCause() {
Fasta data("../../data/segmentation.fasta", 1, " ");
Germline *germline ;
germline = new Germline("TRG", 'G', seqV, seqV, seqJ, "##########", 0, 10);
germline = new Germline("TRG", 'G', seqV, seqV, seqJ, 0, 10);
germline->new_index("##########");
MultiGermline *multi ;
multi = new MultiGermline();
......@@ -197,8 +202,9 @@ void testExtractor() {
OnlineFasta data("../../data/segmentation.fasta", 1, " ");
Germline *germline ;
germline = new Germline("TRG", 'G', seqV, seqV, seqJ, "##########", 0, 10);
germline = new Germline("TRG", 'G', seqV, seqV, seqJ, 0, 10);
germline->new_index("##########");
MultiGermline *multi ;
multi = new MultiGermline();
multi->insert(germline);
......
This diff is collapsed.
This changelog concerns the algorithmic part (C++) of Vidjil.
2014-10-XX The Vidjil Team
* Streamlined filtering options (-r/-y/-z), better documented (doc/algo.org)
* Streamlined output files (xxxxxxxxxx)
* Updated .data .json output, now in the stable 2014.10 format (documented in doc/format-analysis.org)
* New experimental multi-germline analysis (-g). This will be improved and documented in a next release.
* Refactored main vidjil.cpp, objects storing germlines and statistics (core/germline.cpp, core/stats.cpp)
* Transferred clustering from clone output to information in .data, again simplifying vidjil.cpp
* Removed unused code parts as well as some files
* Bugs closed
2014-09-23 The Vidjil Team
* Export cause of non-segmentation in the .data
* New option to output segmented reads (-U), now by default segmented reads are not output one by one
......
......@@ -110,9 +110,9 @@ Limits to report a clone (or a window)
-% <ratio> minimal percentage of reads supporting a clone (default: 0)
Limits to further analyze some clones
-y <nb> maximal number of clones computed with a representative (0: no limit) (default: 100)
-z <nb> maximal number of clones to be segmented (0: no limit, do not use) (default: 20)
-A reports and segments all clones (-r 0 -% 0 -z 0), to be used only on very small datasets
-y <nb> maximal number of clones computed with a representative ('all': no limit) (default: 100)
-z <nb> maximal number of clones to be segmented ('all': no limit, do not use) (default: 20)
-A reports and segments all clones (-r 1 -% 0 -y all -z all), to be used only on very small datasets
#+END_EXAMPLE
The =-r/-%= options are strong thresholds: if a clone does not have
......@@ -125,7 +125,7 @@ MRD detection).
The =-y= option limits the number of clones for which a representative
sequence is computed. Usually you do not need to have more
representatives (see below), but you can safely put =-y 0= if you want
representatives (see below), but you can safely put =-y all= if you want
to compute all representative sequences.
The =-z= option limits the number of clones that are fully analyzed,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment