# Claire Lemaitre
# 16/10/2015

# Creates a small dataset to test MindTheGap find
# With :
#  - several chromosomes
#  - all types of variants = solo SNP, multi SNP, homozygous insertion fuzzy or not, heterozygous insertion fuzzy or not, homozygous insertion with a SNP close before or after the insertion, homozygous deletion

# Here, positions are 0-based

# 1. Generates random sequences
~/workspace/divers_scripts/gener_alea 1000 5
mv alea.seq init.fasta

init.fasta = reference.fasta
cp init.fasta reference.fasta

# 2. Put 13 SNPs
cp init.fasta initSnp.fasta
liste des SNPs : (0-based)
Seq0 100 T -> C
Seq0 815 C -> A
Seq1 205 G -> C   # 2 snps proches
Seq1 218 T -> A
Seq2 319 T -> C   # 2 snp proches (k=31)
Seq2 343 C -> A
Seq2 378 G -> C
Seq3 255 A -> T
Seq3 510 C -> A
Seq3 765 G -> A
Seq4 256 C -> T
Seq4 511 A -> G
Seq4 840 C -> T

# 3. Put 3 deletions (homozygous)
cp initSnp.fasta initSnpAndDel.fasta
dans initSnpAndDel.fasta :
Seq0 296 -> 410  clean seq = TAGCTTGAGAGTGCGTATCTCACCGATCCCCTGGCTATGCTCCGCGATTCACTAGTAGTTTCACGCCGACAGAGCGAAACCGTGATAGGTCATCATGCCGGTCTGCAGTCACGT
Seq1 739 -> 847 fuzzy repeat 2 CT debut del seq = CTGTTGGGAAGGAATTGCAATACTCTCCGAACCAGCTTAGGGCCCCCCGCCGCCGCAATTCGAGCGTTATGCCCGGAGCATTTGCACGATGCCATTAAACTATATCAA
Seq4 884 -> 928 fuzzy repeat 2, 1 lettre de chaque côté : A et T seq = AGGGACCTAGACGCAACAGTAACCGCCTCGGAGTAAGCCCTGGT

# 4. Put 5 homozygous insertions
~/workspace/divers_scripts/gener_alea 3000 1 : pour piocher des séquences à insérer
cp initSnpAndDel.fasta allele1.fasta
dans allele1.fasta :
Seq2 834 fuzzy rep 1 (T) seq=TGCACGCTGCAGGATTGGAACCACAATGTACGCCGATCCAAGCAGTAGTGGTTCATTGTATAAGTATCCTCCCTTGATTGGTCGAATATTAGGCATGCCCCGGGAGCATGTGGGCTCGAGCCACGGAGAGCAACTAATCGCGCATAAAACAAATACCTCATGGTTTTTGTGCGGAAAACCGTTGGGTGGACCATCAGCGGTTGTGAT
Seq2 535 clean seq= TAACGTTCGCTGAACATCGACTCCGGTGACGACATACGATTCAAGAAGAGAGTGACTCTGTAGGATAACATCCCGCAACGCCTAATCCATCCAGCCTGGCACCATGTATAAAGGGCGTCAGGTATGTTAACGAGACTATT
Seq4 820 clean before SNP seq = GGATGGCGGCCGGAGAGCGCTGCAATCGCATGGCTCGGGA
Seq4 600 fuzzy rep 3 (1+2 GG + A) seq=GGTGTATTCCTGGGTTGAGTGGCAGGTTTCTCTTAATTCTTCCCTAAGTAGCTCCGA
Seq3 780 clean after SNP seq = TTTGCAGCACTAGCCGTTCCTTGACATCTGCGGCCAACTTGTGCCTGAACCTGGAGTTTCGACAGCGTGGCGCTCTGGCCTAGTTCTTCGCTGGCACCTGGAAGAGCCGCC

# 5. Put 3 heterozygous insertions
cp allele1.fasta allele2.fasta
dans allele2.fasta
Seq1 341 clean seq = ATGGTTTATAGAACCCGGGCGTTCATGTCCGTCAGAACGATCTTGGCACGGTAGCCCCTGGTCCAGAGAGCCAAGGTGACTCAGCCCCACGATGGTGGTCTAGAGCGAAATAACCCTCGCCGAGA
Seq4 348 fuzzy 2 CA seq= CAGTCTTAACCTTAAGACCGTTCATTGATAAAACTTGCTCACGCTCTAGATGGCGTGAAGCGAAACCTAGGAAAAAGTTTTGCAGATAATTAGATTATGCGCGATACTCCGCCGTGTGTT
Seq0 122 clean after a SNP seq= ATCTAAGCTGTGACCTTGTGGCCGAGGCGCTTTTCACGCCTACATTAACTCCTGGGAAGCTCTCTGCTCTAGTTTCAGTGCACATCTCCAGGTGAGCAACCCTGGCAAGCAGCCCCTTCCTGTAGAAATTACTTAGC
 
../build/MindTheGap find -in full_test/allele1.fasta,full_test/allele2.fasta -ref full_test/reference.fasta -abundance-min 1 -out full-test1


## Pb MTG : deletion position apres la deletion (premiere base deletée)
      	    insertion HOM avant/apres un SNP, position décalée de 1 ??? vérifier les kmers breakpoints (seq4 821
	    insertion HET apres SNP non détectée, détéctable ?
	    2 backups d'ou viennent ces trous ??? vérifier les positions
	    MSNP seq2 319 raté : non mais affiché avec position 367 = 343 + 24 au lieu de 343 - 24
	    Backup position 305 = début MSNP en position 319 (right-kmer : position 305)
	    Backup position 289  = position 337 (right kmer n'existe pas dans ref. existe dans allele1 finit en position 319

	    Si on fait tourner que sur initSnp -> aucun soucis, idem sur initSnpAndDel, allele1 seul, allele2 seul : pas de backup. Si -snp-only : pas de backup. Vient de hétéro ? non -> si homo-only : 2 backup
	    

# Ajout de print pour debugger : séquences de 01 : dans FindBreakpoints.hpp, lignes ~400

sequence Seq2
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000011000000000000000000000000000000000000011110000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000010000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

2 FP successifs (ces kmers n'existent pas dans les allele1 ou allele2.fasta) en position 305 et 306
=> ces FPs existent seulement avec -in full_test/allele1.fasta,full_test/allele2.fasta  --> explique pourquoi tout se passe bien avec -in initSnp ou initSnpAndDel.fasta
=> avec -snp-only : ne sort pas de backup même s'il y en a (pas demandé)
=> position 367 : à cause de ces FPs, le SNP 343 est trouvé en partant de la droite, puis trouve un 0 à gauche, donc essaie un autre SNP (sans se souvenir qu'il va dépasser la taille du trou), donc trouve le SNP en position 319, MAIS reste le bug de position 343+24 au lieu de 343-24 : est-ce que ça avait été testé ?
Le premier backup est quand même renvoyé (la position est : position du premier 1 après le trou), car ne sait pas qu'il a finalement résolu le pb en partant de la droite.
Le deuxième backup : gap_stretch_size = 18446744073709551598 : car avec SNP 319 est allé plus loin que le trou, donc taille négative ! 

--> résolution pb de position pour SNPs proches  (bug dans FindSNP.hpp : FindMultiSNPrev<span>::update() -> begin_pos-= nb_kmer_val au lieu de +=)

=> 2 solutions : 
 - soit faire attention dans MultipleSNP de ne pas dépasser la taille du trou : tant pis on ne trouve pas le SNP 319 du tout  --> DONE
 - soit ne pas renvoyer de backup du tout : NON cf. plus bas
pour full_test : ajouter le SNP 367, voir si même avec les FPs, on retrouve 3 SNPs sur 4 des multiples (du coup test si partir de la droite marche bien)
attention : les FPs peuvent dépendre des fonctions de hash, et ce test n'ura pas toujours les mêmes résus...


Nouveau jeu avec les FP après le muti-SNp --> pour tester multi-SNP avant FP
 reference-bis.fasta seq2 292 A -> T
--> si autorise multiSNP à dépasser la taille : 2 SNP FP en trop --> option n°1 validée (et implémentée)

UPDATE 27/05/2016 :
 Not detected : - Seq0 122 HET clean after SNP # not detected for the moment : not possible due to update after SNPs only touching gap-stretch-size ?
     	      	- Seq2 319 MSNP T -> C # 2 close snp, note : due to bloom-FP can be missed
 Now reported positions are 1-based and points to the nucleotide of the variant (SNP), or just before (at the left) : deletions, insertions.


# 6. Generate reads :
l=5000
1000 reads -> c=20x
~/Bin/samtools-0.1.18/misc/wgsim -e 0.01 -d 200 -s 20 -N 500 -1 100 -2 100 -r 0 -R 0 allele1.fasta allele1_r1.fq allele1_r2.fq
~/Bin/samtools-0.1.18/misc/wgsim -e 0.01 -d 200 -s 20 -N 500 -1 100 -2 100 -r 0 -R 0 allele2.fasta allele2_r1.fq allele2_r2.fq

cat allele1_r1.fq allele2_r1.fq > reads_r1.fastq
cat allele1_r2.fq allele2_r2.fq > reads_r2.fastq

../build/bin/MindTheGap find -in full_test/reads_r1.fastq,full_test/reads_r2.fastq -ref full_test/reference.fasta -abundance-min auto -out test-reads

Avec les reads le SNP 320 est trouvé (pas de pb de bloom-FP)

cp reads_r1.fq ../../data/reads_r1.fastq
cp reads_r2.fq ../../data/reads_r2.fastq
cp reference.fasta ../../data/reference.fasta


# 7. Create Gold files for automated tests

../../build/bin/MindTheGap find -in ../../data/reads_r1.fastq,../../data/reads_r2.fastq -ref ../../data/reference.fasta -out gold > gold_find.output
../../build/bin/MindTheGap fill -graph gold.h5 -bkpt gold.breakpoints -out gold > gold_fill.output