diff --git a/bin/DTM/data_prepare.pl b/bin/DTM/data_prepare.pl
index f4e3dd6c46c4d1eb922ccc18a5555154dc6cfe01..2b0776a03f59432d5d8d1643264c8c27229b3537 100644
--- a/bin/DTM/data_prepare.pl
+++ b/bin/DTM/data_prepare.pl
@@ -177,6 +177,21 @@ MAIN:
 			}
 		}
 
+		# parametrage pour NGL
+		my $regexpRunCreated = '^RunNGL-Bi.created$';
+		my $file_run_bi = `ls -t | egrep $regexpRunCreated  | head -1`; $? and (print STDERR("[Erreur]Récup du fichier $regexpRunCreated\n") and die);
+		chomp($file_run_bi);
+		print ("\tFichier run NGL-Bi trouvé : $file_run_bi\n");
+		open (RUNBI, $file_run_bi);
+		my $ngl_bi_run_name = <RUNBI>;
+		close (RUNBI);
+
+		my $sq_xp_code = `grep 'Experiment Name' SampleSheet.csv | cut -d',' -f2`; $? and print STDERR("[Erreur]Récup du code experience NGL-SQ\n");
+		chomp($sq_xp_code);
+		if ( length($sq_xp_code) <= 3 ) {
+			undef($sq_xp_code);
+		}
+
 		my $nf_params_file = "${project}_params.yml";
 		open (NF_PARAMS,"> $nf_params_file") or (print STDERR("Impossible d'ouvrir le fichier $nf_params_file : $!\n") and die);
 
@@ -196,6 +211,9 @@ MAIN:
 		print NF_PARAMS "fc_id: '$fcID'\n";
 		print NF_PARAMS "fc_type: '$fcType'\n";
 		print NF_PARAMS "lane: '$laneNumber'\n";
+		print NF_PARAMS "insert_to_ngl: false\n" unless (defined($sq_xp_code));
+		print NF_PARAMS "sq_xp_code: '$sq_xp_code'\n" if (defined($sq_xp_code));	
+		print NF_PARAMS "bi_run_code: '$ngl_bi_run_name'\n" if (defined($ngl_bi_run_name));	
 		print NF_PARAMS "demux_uniqueness: $demuxUniqueness\n";
 		print NF_PARAMS "min_overlap: $minOverlap\n" if (defined($minOverlap));	# parametre non obligatoire
 		print NF_PARAMS "max_overlap: $maxOverlap\n" if (defined($maxOverlap));	# parametre non obligatoire
diff --git a/bin/extractInfo.pl b/bin/extractInfo.pl
deleted file mode 100755
index bedf21becfc4950da49f7cd3605bed7ab84b249b..0000000000000000000000000000000000000000
--- a/bin/extractInfo.pl
+++ /dev/null
@@ -1,396 +0,0 @@
-#!/usr/bin/perl -w
- 
-=head1 NAME
-
- extractInfo.pl
- 
-=head1 DESCRIPTION
-
- Récupère les informations de la SampleSheet et du RunInfo.xml pour écrire le masque récupéré par extractReads.pl
- 
-=head1 SYNOPSIS
-
- extractInfo.pl -h | -s SampleSheet.csv -r RunInfo.xml
-
-=head1 OPTIONS
-
- -s : fichier SampleSheet.csv - input
- -r : fichier RunInfo.xml - input
-
-=head1 VERSION
- 
-=head1 DEPENDENCIES
-
-=head1 AUTHOR
-
- Plateforme genomique Toulouse (get-plage.ngs@genotoul.fr)
-
-=cut
-#############################################################################################################################
-#
-#               LIBRAIRIES
-#
-#############################################################################################################################
-use strict;
-use Getopt::Long;
-use File::Copy "cp";
-use File::Basename;
-use SOAP::Lite;
-use List::MoreUtils qw(indexes);
-use Log::Log4perl ();
-use Log::Log4perl qw(:easy);#FATAL ERROR WARN INFO DEBUG TRACE
-use Pod::Usage;
-use Switch;
-use utf8;
-#local $/ = "\r\n";
-
-#############################################################################################################################
-#
-#               EXEMPLE DE RUNINFO.XML
-#
-#############################################################################################################################
-
-#MiSeq
-#    <Reads>
-#      <Read NumCycles="151" Number="1" IsIndexedRead="N" />
-#      <Read NumCycles="6" Number="2" IsIndexedRead="Y" />
-#      <Read NumCycles="151" Number="3" IsIndexedRead="N" />
-#    </Reads>
-
-#HiSeq3000 Run Simple + Dual index
-#    <Reads>
-#      <Read Number="1" NumCycles="151" IsIndexedRead="N" />
-#      <Read Number="2" NumCycles="8" IsIndexedRead="Y" />
-#      <Read Number="3" NumCycles="8" IsIndexedRead="Y" />
-#      <Read Number="4" NumCycles="151" IsIndexedRead="N" />
-#    </Reads>
-
-
-
-#############################################################################################################################
-#
-#               MAIN
-#
-#############################################################################################################################
-MAIN:
-{
-	# Initialisation du log
-	Log::Log4perl -> easy_init( { 	level    => $TRACE,
-                            		utf8     => 1,
-                            		layout   => '[%d][%p> extractInfo.pl:L%L %M] %m%n' } );
-	my $logger = Log::Log4perl -> get_logger();
-	$logger -> info("Entrée dans le programme");
-
-	# Parametre du programme
-	my $help = 0 ;
-	my $RunInfo;
-	my $SampleSheet;
-	
-	# Recuperation des options
-	GetOptions (    'help|h' => \$help,
-					'r=s' => \$RunInfo, #string
-					's:s' => \$SampleSheet); #string
-	if($help){
-		pod2usage(
-			-verbose => 99
-		);
-	}
-	
-	##################
-	# Programme 
-	##################
-	
-	my $SSformat;
-	my $checkIEM;
-	my $check10x;
-	my $config_file = "Run.conf";		# fichier d'output qui va etre pris comme input pour GenerateCasavaDir.pl pour les analyses standard.
-	#my $config10X_file = "Run_10X.conf";	# fichier d'output qui va etre pris comme input pour GenerateCasavaDir.pl pour les analyses 10X.
-	
-	if (-s $SampleSheet) {
-		$SSformat = check_my_SSFormat($SampleSheet);
-	}
-	$check10x = ($SSformat eq '10X') ? 1 : 0;
-	$checkIEM = ($SSformat eq 'IEM') ? 1 : 0;
-	
-	if( $checkIEM && $check10x){
-		$logger -> logdie("[Error] Le programme ne fonctionne pas quand on lui donne Illumina ET 10x.");
-	}
-	if( !$checkIEM && !$check10x){
-		$logger -> logdie("[Error] Le programme ne fonctionne pas sans samplesheet.");
-	}
-	$logger -> info("\tcheckIEM : ".$checkIEM." | check10x : ".$check10x);
-	
-	#  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	#  Parsing du fichier RunInfo.xml
-	#  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	$logger -> info("Analyse du fichier RunInfo.xml");
-	
-	# Récupération de la taille des reads et d'index par le nombre de cycles
-	my $runInfo_lengthR1 = 0;
-	my $runInfo_lengthR2 = "";	
-	my $runInfo_lengthI1 = 0;
-	my $runInfo_lengthI2 = "";
-	
-	# Informations recuperees par capture de regex
-	my $versionRunInfo;
-	my $number = "";
-	my $numCycle = "";
-	my $isIndexed = "";
-	
-	# Configuration du run
-	my $runInfo_config = "single";			#dual|single|noindex
-	
-	open(F,"$RunInfo") or $logger -> logdie("[Erreur] Impossible d'ouvrir le fichier RunInfo.xml");
-	while(my $ligne =<F>){
-		chomp($ligne);		
-		# Recuperation de la version de RunInfo
-		#<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> -> MiSeq
-		#<RunInfo Version="5"> -> Nova		
-		if( $ligne =~ /\<RunInfo / ){
-			($versionRunInfo) = $ligne =~ m/<RunInfo.* Version="(\d)">/;
-			$logger -> info("\tVersion du RunInfo : ".$versionRunInfo);
-			next;
-		}
-		
-		next if( $ligne !~ /\s*<Read /); # Analyse uniquement sur les lignes de read
-		if( $versionRunInfo eq "2"){
-			($numCycle, $number, $isIndexed) = $ligne =~ m/<Read NumCycles="(\d+)" Number="(\d)" IsIndexedRead="(Y|N)" \/\>/;
-		} elsif( $versionRunInfo eq "5"){
-			($number, $numCycle, $isIndexed) = $ligne =~ m/<Read Number="(\d)" NumCycles="(\d+)" IsIndexedRead="(Y|N)"\/\>/;
-		} else {
-			$logger -> logdie("[Erreur] Le numero de version de RunInfo.xml ne correspond à rien de connu" );
-		}
-		$logger -> info("\t\tRésultat des captures : NumCycle ".$numCycle." | number ".$number." | IsIndexed ".$isIndexed);
-		
-		# Interpretation pour connaitre les longueurs des cycles
-		if ($isIndexed eq "N" && $number eq 1){ # Read 1
-			$runInfo_lengthR1 = $numCycle;
-		}
-		if ($isIndexed eq "N" && $number ne 1){ #Read 2
-			$runInfo_lengthR2 = $numCycle;
-		}
-		if ($isIndexed eq "Y" && $runInfo_lengthI1 eq 0){ #Index 1
-			$runInfo_lengthI1 = $numCycle;
-		}
-		elsif ($isIndexed eq "Y" && $runInfo_lengthI1 ne 0){ #Index 2
-			$runInfo_lengthI2 = $numCycle;
-			$runInfo_config = "dual";
-		}
-	}
-	close F;
-	
-	$logger -> logdie("Impossible de capter les infos de numCycle, number, isIndexed" ) if (($numCycle eq "") ||  ($number eq "") || ($isIndexed eq ""));
-	$runInfo_config = "noindex" if($runInfo_lengthI1 eq 0);
-	$logger -> info("\tConfig : ".$runInfo_config.
-					" | R1 = ". $runInfo_lengthR1 ." | R2 = ". $runInfo_lengthR2.
-					" | I1 = ". $runInfo_lengthI1 ." | I2 = ". $runInfo_lengthI2);
-	
-	#  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	# Traitement de la samplesheet
-	#  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	
-	# Parametrage  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	
-	my $lane_10x = "";
-	my $cmdOptions_10x = "";
-	
-	my $mask;
-	my $index1; my $index2; # Variables temporaires stockant l'info des colonnes index et index2 pour une lane donnée
-	my $lane; # Variable temporaire stockant le numéro de la lane étudiée
-	my %info_lane; #Tableau regroupant l'information de configuration des index par lane
-		
-	# Construction du dico %line_interpreter qui rassemble les différents formats de SS IEM possibles
-	my %line_interpreter; # MNL = mono lane | MTL = multi lane | SI = Single index | DI = Dual index
-	$line_interpreter{"MonoLane-SingleIndex"} = "Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description";
-	$line_interpreter{"MonoLane-DualIndex"} = "Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description";
-	$line_interpreter{"MultiLane-SingleIndex"} = "Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description";
-	$line_interpreter{"MultiLane-DualIndex"} = "Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description";
-	my $samplesheet_config = ""; # La config de la SS
-	my %indexHeaderSS_dict = (); # Dico qui associe clé-colonne : valeur-index
-	
-	# Construction du dico %length_index qui associe la longueur d'un index 10X à son préfixe
-	my %length_index;
-	$length_index{"SI-GA"}{"idx1"}=8; $length_index{"SI-GA"}{"idx2"}=0;
-	$length_index{"SI-NA"}{"idx1"}=8; $length_index{"SI-NA"}{"idx2"}=0;
-	$length_index{"SI-TT"}{"idx1"}=10; $length_index{"SI-TT"}{"idx2"}=10;
-	
-	# Parcours de la Samplesheet  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	$logger -> info("Analyse du fichier ".$SampleSheet);
-	my $headerline_present = 0;
-	open(S,"$SampleSheet") or $logger -> logdie("[Erreur] Impossible d'ouvrir la SampleSheet $SampleSheet");
-	LINE: while(my $ligne = <S>){
-		chomp($ligne);
-		next LINE if not ($ligne =~ /.*,.*,.*/); # Sauter les lignes du début qui ont 0 ou 1 virgule
-		if($ligne =~ /.*Sample_ID,.*/){
-			$headerline_present = 1;
-			# Détermination du mode de la Samplesheet
-			# (Tout est dans ce bloc pour être exécuté une seule fois dans la boucle)
-			foreach my $SS_config (keys %line_interpreter){
-				$samplesheet_config = $SS_config if ($line_interpreter{$SS_config} eq $ligne);
-			}
-			$logger -> logdie("[Erreur] Aucune config ne correspond à la SS :(") if( $samplesheet_config eq "" );
-			$logger -> info("\tSS en config $samplesheet_config");
-			
-			# Construction d'un tableau permettant de construire le dico qui associe le numéro de la colonne au nom de la colonne
-			my @headerSS_tab = split(/,/, $line_interpreter{$samplesheet_config});
-			foreach my $column_name (@headerSS_tab){
-				$indexHeaderSS_dict{$column_name} = indexes { $_ eq $column_name } @headerSS_tab;
-			}			
-			next LINE;
-		}
-		$logger -> logdie("[Erreur] La samplesheet $SampleSheet ne contient pas de header") if( !$headerline_present);
-		next LINE if($info_lane{$lane});  # On considère que tous les échantillons d'une même lane sont indexés pareils
-		
-		my @list = split(/,/,$ligne);		
-		$index1 = $list[$indexHeaderSS_dict{'index'}]; # enregistre la séquence de l'index1 ou SI-GA...
-		$index2 = ($samplesheet_config =~ /DualIndex/) ? $list[$indexHeaderSS_dict{'index2'}] : "" ;
-		$lane = ($samplesheet_config =~ /MultiLane/) ? $list[$indexHeaderSS_dict{'Lane'}] : '1' ;
-		
-		# Contrairement à illumina qui ont la séquence notée, les index 10X ont le nom de l'index (sauf les customs!!)
-		if($check10x){
-			$logger -> info("Gestion du 10X");
-			$lane_10x .= $lane.",";
-			my $prefixe_index = substr($index1, 0, 5);
-			if($list[$indexHeaderSS_dict{'I7_Index_ID'}] !~ "Custom_"){
-				$index1 = ("X"x$length_index{$prefixe_index}{idx1}); # dico contenant les longueurs des index 10x pour filouter
-				$index2 = ("X"x$length_index{$prefixe_index}{idx2}) if($samplesheet_config =~ /DualIndex/);
-			}
-		}			
-		# Bilan pour la lane étudiée
-		$logger -> info("\tSur la lane ".$lane." -> Index1 : ".$index1. " | Index2 : ".$index2);
-		
-		# Remplissage du dico info_lane : infolane{#1}=8,8 par exemple
-		$info_lane{$lane} = length($index1);
-		$info_lane{$lane} .= ",".length($index2) if($runInfo_config eq "dual") ;
-		$logger -> info("\tLane ".$lane. " : ".$info_lane{$lane});
-	}
-	close S;
-	
-	# Ecriture des options 10X
-	if($check10x){
-		chop $lane_10x;
-		$cmdOptions_10x = "--lanes=".$lane_10x;
-		$cmdOptions_10x .= " --filter-single-index " if(($runInfo_config eq "dual") and ($samplesheet_config =~ /SingleIndex/));
-		$cmdOptions_10x .= " --filter-dual-index " if(($runInfo_config eq "dual") and ($samplesheet_config =~ /DualIndex/));
-	}
-	
-	# Rechercher si bool_change_config ?
-	#my $bool_change_config;
-	#Ecriture du masque  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
-	$logger -> info("Ecriture du masque");
-	my $masque_read1 = "Y".($runInfo_lengthR1-1)."n";
-	my $masque_read2 = ($runInfo_lengthR2 eq "") ? " ": ",Y".($runInfo_lengthR2-1)."n";
-	$logger -> info("masqueR1 : ".$masque_read1." | masqueR2 :".$masque_read2);
-	
-# 	if( $samplesheet_config =~ /MonoLane/){
-# 		$logger -> info("\tEn mono-lane");
-# 		$mask = " --use-bases-mask ".$masque_read1;
-# 		$logger -> info("masque : ".$mask);
-# 		$mask .= ",I$runInfo_lengthI1" if($runInfo_config eq "single");
-# 		$logger -> info("masque : ".$mask);
-# 		$mask .= ",I$runInfo_lengthI1,I$runInfo_lengthI2" if($runInfo_config eq "dual");
-# 		$logger -> info("masque : ".$mask);
-# 		$mask .= "$masque_read2";
-# 		$logger -> info("masque : ".$mask);
-# 		$logger -> info("masqueR1 : ".$masque_read1." | masqueR2 :".$masque_read2);
-# 
-# 	}else{ # Multilane
-# 		$logger -> info("\tEn multi-lane");
-# 		my $nb_n_idx1; # Nombre de n à la fin de l'index 1
-# 		my $nb_n_idx2; # Nombre de n à la fin de l'index 2
-# 		my @idx = keys(%info_lane);
-# 
-# 		foreach my $k (keys(%info_lane)) {
-# 			$mask .= " --use-bases-mask ".$k.":".$masque_read1;
-# 			
-# 			if($runInfo_config eq "single"){
-# 				$mask .= ",n*" if($info_lane{$k} eq "0"); #si la lane est NoIndex, n'a pas d'index 1
-# 				$mask .= ",I".$info_lane{$k}.("n" x ($runInfo_lengthI1-$info_lane{$k})) if($info_lane{$k} ne "0"); #si la lane a 1 index
-# 				
-# 			}elsif($runInfo_config eq "dual"){
-# 				my @list = split(/,/,$info_lane{$k});
-# 				$nb_n_idx1 = $runInfo_lengthI1-$list[0];
-# 				#si la lane est NoIndex ; n'a pas d'index 1 et 2
-# 				if($list[0] eq "0"){
-# 					$mask .= ",n*,n*";
-# 				#si la lane est single index ; l'index 2 est vide
-# 				}elsif($list[1] eq "0"){
-# 					$mask .= ",I".$list[0].("n"x$nb_n_idx1).",n*";
-# 				#si la lane a 2 index
-# 				}else{
-# 					$nb_n_idx2 = $runInfo_lengthI2-$list[1];
-# 					$mask .= ",I".$list[0].("n"x$nb_n_idx1).",I".$list[1].("n"x$nb_n_idx2);
-# 				}
-# 			}
-# 			$mask .= "$masque_read2";
-# 		}
-# 	}
-	my $nb_n_idx1; # Nombre de n à la fin de l'index 1
-	my $nb_n_idx2; # Nombre de n à la fin de l'index 2
-	my @idx = keys(%info_lane);
-
-	foreach my $k (keys(%info_lane)) {
-		$mask .= " --use-bases-mask ".$k.":".$masque_read1;
-		
-		if($runInfo_config eq "single"){
-			$mask .= ",n*" if($info_lane{$k} eq "0"); #si la lane est NoIndex, n'a pas d'index 1
-			$mask .= ",I".$info_lane{$k}.("n" x ($runInfo_lengthI1-$info_lane{$k})) if($info_lane{$k} ne "0"); #si la lane a 1 index
-			
-		}elsif($runInfo_config eq "dual"){
-			my @list = split(/,/,$info_lane{$k});
-			$nb_n_idx1 = $runInfo_lengthI1-$list[0];
-			#si la lane est NoIndex ; n'a pas d'index 1 et 2
-			if($list[0] eq "0"){
-				$mask .= ",n*,n*";
-			#si la lane est single index ; l'index 2 est vide
-			}elsif($list[1] eq "0"){
-				$mask .= ",I".$list[0].("n"x$nb_n_idx1).",n*";
-			#si la lane a 2 index
-			}else{
-				$nb_n_idx2 = $runInfo_lengthI2-$list[1];
-				$mask .= ",I".$list[0].("n"x$nb_n_idx1).",I".$list[1].("n"x$nb_n_idx2);
-			}
-		}
-		$mask .= "$masque_read2";
-	}
-	$logger -> info("\t\tConfig de la Samplesheet : ".$samplesheet_config. " | Masque : " . $mask);
-	
-	#Ecriture du fichier Run.conf pour la samplesheet IEM #  #  #  #  #
-	open(O, ">$config_file") or $logger -> logdie("Error in opening config file $config_file");
-	print O "SAMPLESHEET=$SampleSheet\n";
-	print O "RUNCONFIG=$runInfo_config\n";
-	print O "MASQUE=$mask\n";
-	print O "OPTIONS=$cmdOptions_10x\n" if($check10x);
-	print O "DEMUX=$SSformat\n";
-	close O;
-}
-
-=head2 function check_my_SSFormat
-
-	Title		 : check_my_SSFormat
-	Usage		 : $boolean = check_my_SSFormat( $samplesheet, mode);
-	Prerequisite : None
-	Function	 : Send an email and check if the sending went well
-	Returns	     : Boolean
-	Args		 : $mContent, $mSubject, $mCC, $mRecipients : strings
-	Globals	     : none
-
-=cut
-
-sub check_my_SSFormat {
-	my ($samplesheet_to_test) = @_;
-	my $logger = Log::Log4perl -> get_logger('check_my_SSFormat');
-	
-	my $chemistrySS = `grep Chemistry $samplesheet_to_test`; $? and $logger -> logdie("Récupération de 'Chemistry' en echec" );
-	my ($chemistry) = $chemistrySS =~ m/^Chemistry,(\w+)$/;
-	
-	if ($chemistry eq '10X'){
-		$logger -> info("$samplesheet_to_test au format 10X");
-		return '10X';
-	}elsif($chemistry eq 'Default' or $chemistry eq 'amplicon' ){
-		$logger -> info("$samplesheet_to_test au format 'IEM'");
-		return 'IEM';
-	}else{
-		$logger -> logdie("[Erreur] On aurait du rentrer dans le cas IEM ou 10X" );
-	}
-}
diff --git a/bin/extractReads.pl b/bin/extractReads.pl
deleted file mode 100755
index a3f5b2b8019c20fad82b95a16b2757be76268e49..0000000000000000000000000000000000000000
--- a/bin/extractReads.pl
+++ /dev/null
@@ -1,506 +0,0 @@
-#!/usr/bin/perl -w
-binmode STDIN,  ':encoding(UTF-8)';
-binmode STDOUT, ':encoding(UTF-8)';
-binmode STDERR, ':encoding(UTF-8)';
-
-=head1 NAME
-
- extractReads.pl
- 
-=head1 DESCRIPTION
-
- Initailisation du pipeline wf-Illumina-nf
- Decoupage de la samplesheet
- Creation du run dans NGL-Bi
- Parametrage et lancement des analyses qualite via wf-Illumina-nf/main.nf
- 
-=head1 SYNOPSIS
-
- extractReads.pl -h | |-sequencer|s type_sequencer] 2>> /work/sbsuser/Logs/cronMACHINE.txt
-
-=head1 OPTIONS
-
- -sequencer|s : Type de sequenceur (MiSeq ou NovaSeq) -> Obligatoire
- -test|t : Activer le mode test -> Facultatif
- -mailTest|m : Preciser l'adresse mail a laquelle envoyer les messages de log -> obligatoire si test
- -samplesheetDemux|i : i comme IEM pour préciser la samplesheet é prendre en compte -> Facultatif
- -jFlow|j : pour préciser la feuille jflow é prendre en compte  -> Facultatif
- 
-=head1 EXEMPLES
-
- perl extractReads.pl -s MiSeq
- perl extractReads.pl -s MiSeq -t -m hermione.granger@poudlard.uk
-
- 
-=head1 DEPENDENCIES
-
- - Web service permettant la recuperation des adresses mails a partir de l'id 
-
-=head1 AUTHOR
- Jules Sabban pour Plateforme genomique Toulouse (get-plage.bioinfo@genotoul.fr)
- 
-=cut
-
-###################################################################
-#
-#						LIBRAIRIES
-#
-###################################################################
-use strict;
-use Getopt::Long;
-use utf8;
-use Log::Log4perl ();
-use Log::Log4perl qw(:easy);#FATAL ERROR WARN INFO DEBUG TRACE
-#use File::Util;
-use File::chdir;
-use File::Copy "cp";
-use File::Copy "move";
-use Cwd 'abs_path';
-
-
-###################################################################
-#
-#						MAIN
-#
-###################################################################
-MAIN:
-{
-	###############################################################
-	#						INITIALISATION
-	###############################################################	
-	
-	# Initialisation du log
-	Log::Log4perl -> easy_init( { 	level    => $TRACE,
-                            		utf8     => 1,
-                            		layout   => '[%d][%p> extractReads.pl:L%L %M] %m%n' } );
-	my $logger = Log::Log4perl -> get_logger();
-
-	# Récupération des options
-	my $help = 0 ;
-	my $sequencer = "";
-	my $demuxType_int;
-	my $demuxType;
-	my $file_samplesheet = "";
-	my $file_jflow = "";
-	my $arg_timestamp = ""; # on supprime
-	my $arg_jobid = "";	# on supprime
-	my $mailTEST = "";
-	my $checkTest = "";
-
-	GetOptions ('help|h' => \$help, 
-				'sequencer|s=s' => \$sequencer,
-				'samplesheetDemux|i:s'=> \$file_samplesheet, # i forIEM...
-				'jFlow|j:s'=> \$file_jflow,
-				'timestamp:i'=>\$arg_timestamp,
-				'demuxJobid:s'=>\$arg_jobid,
-				'mailTesteur|m:s' => \$mailTEST,
-				'isTest|t' => \$checkTest,
-	);
-	
-	if($help){
-		pod2usage(-verbose => 1 );
-	}
-
-	print STDERR "\n";
-	print STDERR "#    #    #    #    #    #    #    #    #    #\n";
-	print STDERR "#    #    extractReads.pl is happening  #    #\n";
-	print STDERR "#    #    #    #    #    #    #    #    #    #\n";
-	print STDERR "\n";
-		
-	$logger -> info("Vérification des arguments");
-
-	# Verification du séquenceur
-	$sequencer ne ""? $logger -> info("\tSequenceur = " . $sequencer) : $logger -> logdie("\tPas de séquenceur précisé...");
-	unless ($sequencer eq "MiSeq" or $sequencer eq "NovaSeq"){
-		$logger -> logdie("Erreur dans le nom du sequenceur : ".$sequencer." n'existe pas");
-	}
-
-	# vérification de la SS
-	$file_samplesheet ne "" ? $logger -> info("\tSamplesheet fournie = " . $file_samplesheet ." !") : $logger -> info("\tPas de samplesheet fournie!");
-	
-	# Gestion du test et/ou des mails
-	$mailTEST ne ""? $logger -> info("\tmailTEST = " . $mailTEST) : $logger -> info("\tPas de mailTEST!");
-	$checkTest ne ""? $logger -> info("\tcheckTEST = " . $checkTest) : $logger -> info("\tPas en mode test!");
-	$checkTest = $checkTest ne ""? 1 : 0;
-	# Si on est en test, on veut une adresse mail!
-	$logger -> logdie("MODE TEST ACTIVE, MERCI DE DONNER UN MAIL AVEC L'OPTION -m MONMAIL\@MONSERVEUR") if( ($checkTest) && ($mailTEST eq "") );
-	my $raw_data="";
-	my $path_to_scripts="";
-	if ($checkTest) {
-		$raw_data = $sequencer eq "MiSeq"? "/home/sbsuser/work/Nextflow/wf-illumina-nf/data_test/MiSeq" : "/home/sbsuser/work/Nextflow/wf-illumina-nf/data_test/NovaSeq";
-		$path_to_scripts=abs_path($0);
-	} else {
-		$raw_data="/$sequencer";
-		$path_to_scripts=abs_path($0);
-	}
-	$logger -> info("\tLes données brutes sont ici : $raw_data");
-	
-	# Configuration API NGL-Bi
-	my $ngl_api_base_prod = "/save/sbsuser/scripts-ngs/NGL-Bi_client_Current/IG/SystemeInteractionNGL-Bi/";
-	my $ngl_api_base_test = "/save/devcrgs/src/NGL_REST_Client/ngl-bi_client/IG/SystemeInteractionNGL-Bi/";
-	my $ngl_api_base = $checkTest? $ngl_api_base_test : $ngl_api_base_prod;
-	my $ngl_bi_scripts="/save/sbsuser/scripts-ngs/NGL-Bi_client_Current/GeT/perl";
-	$ENV{'APIPERL'}=$ngl_api_base;
-	$ENV{'CONFFILE'}=$ngl_api_base."conf/prod_illumina_qc.conf";
-	loadConfFile();
-	unshift @INC,  $ngl_api_base."Common_tools/src/perl/lib/";
-	unshift @INC,  $ngl_api_base."DB_tools/src/perl/lib/";
-	require illumina;
-	require json;
-	$logger -> info("Variables d'environnement pour NGL-Bi chargées depuis : ".$ngl_api_base);
-	# Initialisation des variables
-	my $runExistsInNGL = 0;
-	my $NGLBiRunCreatedFile = 'RunNGL-Bi.created';
-	my $NGLBiReadsetCreatedFil = 'ReadsetsNGL-Bi.created';
-	my $NGLBiRunName = "";
-	my $NGLSQExperimentCode;
-	
-	# Paramétrage général
-	my $prefixLogFolder = "PipelineLogs_Lane";
-
-	
-	###############################################################
-	#					RECHERCHE SAMPLESHEET
-	###############################################################
-	## Recherche SS
-	### parcours des sous répertoires de /$sequencer
-	my $regexpPSS = '^[0-9]{8}_.*_BULKDEMUX_.*csv$';
-	#my @run_directories = $f -> list_dir('/'.$sequencer => {dirs_only = 1, no_fsdots = 1}=; # ls 
-	my @run_directories = `ls $raw_data`; $? and $logger -> logdie("[Erreur] Impossible de récupéer la liste des dossiers de $raw_data}");
-	foreach my $dir (@run_directories){
-		chomp($dir);
-	    #my @RunInfo = ();
-	    my @RunInfo = split("_", $dir); # [$#dir]
-	    # Extraction des infos contenues dans le nom du répertoire
-		my $runDate = $RunInfo[0];
-		my ($annee, $mois, $jour) = ($runDate =~ m/([0-9]{2})([0-9]{2})([0-9]{2})/);
-		my $sequencerID = $RunInfo[1];
-		my $barcodeFlowcell; # Sert é l'unicité des noms des .fastq.gz
-		if ($RunInfo[3] =~ m/000000000-/){
-			my @FCBarcode = split('-', $RunInfo[3]);
-			$barcodeFlowcell = $FCBarcode[$#FCBarcode];
-		} else {
-			$barcodeFlowcell = $RunInfo[3];
-		}
-
-		# Recherche de la SS
-		$logger -> info("Recherche de SampleSheet dans $raw_data/$dir");
-		chdir "$raw_data/$dir" or $logger -> logdie("[Erreur] Impossible de se déplacer dans $raw_data/$dir");
-		#$CWD = "$raw_data/$dir" or $logger -> logdie("[Erreur] Impossible de se déplacer dans $raw_data/$dir");
-		my $preSampleSheet = "PreSampleSheet.csv";
-		my $lastPSS = `ls -t | egrep $regexpPSS | head -1`; $? and $logger -> logdie("[Erreur] Recup de la derniere BulkSS");
-		chomp($lastPSS);
-		if( $lastPSS ne ""){
-			$logger -> info("Check de PSS ".$lastPSS);
-			my $checkPSS = check_my_samplesheet($lastPSS, $preSampleSheet);
-			
-			###############################################################
-			#					CREATION RUN NGL-Bi
-			###############################################################
-			$NGLSQExperimentCode = getNGLSeqExperimentCode($preSampleSheet);
-			$runExistsInNGL = 1 if($NGLSQExperimentCode ne " -");
-			if ($runExistsInNGL){
-				if (! -e $NGLBiRunCreatedFile){
-					# INTEGRATION DU RUN A NGL-BI	#   #   #   #   #   #   #   #   #   #   #
-					$logger -> info("Pas de fichier $NGLBiRunCreatedFile dans $raw_data/$dir -> Le run NGL-Bi semble ne pas exister ");
-					my $commandNGLBiRun = "perl $ngl_bi_scripts/createNGL-BiRun.pl --sequencer $sequencer --NGLSqExperimentCode $NGLSQExperimentCode";
-					$logger -> info("\tCreation du run avec : ".$commandNGLBiRun);
-					my $result_commandNGLBiRun = `$commandNGLBiRun 2>&1`; 
-						$? and $logger -> logdie("[Erreur]Lancement de createNGL-BiRun.pl\n".$result_commandNGLBiRun);
-					$logger -> info("\n".$result_commandNGLBiRun);
-				}else{
-					$logger -> info("Le run existe déjà dans NGL-Bi");
-				}
-			}else{
-				$logger -> info("\tRun en autonomie : n'existe pas dans NGL-SQ");
-				`touch $NGLBiRunCreatedFile`; $? and $logger -> logdie("[Erreur] Impossible de créer le fichier");
-			}
-		} else {
-			$logger -> logdie("Aucune SampleSheet trouvée dans $raw_data/$dir");
-		}
-	
-		# Recherche du fichier de fin de run
-		my $file2checkForEndOfRun = $sequencerID eq "M07093" ? "RTAComplete.txt" : "CopyComplete.txt";
-		if (! -e $file2checkForEndOfRun){
-			$logger -> info("Pas de fichier de fin de run -> sortie du script!");
-			exit;
-		} else {
-			# Détection du nombre de lane
-			$logger -> info("Détection du nombre de headers") ;
-			my $nbHeader = `grep "Header" $preSampleSheet | wc -l` ;  $? and $logger -> logdie("Comptage de [Header] en echec");
-			chomp($nbHeader);
-			$logger -> info("\t$preSampleSheet -> Nb de [header] = ".$nbHeader );
-			
-			# Création des répertoires de logs par lane
-			$logger -> info("Détection des répertoires de log");
-			foreach my $count (1..$nbHeader){
-				my $logFolder = $prefixLogFolder.$count;
-				if (! -d "$raw_data/$dir/$logFolder"){ # Si le rep n'existe pas, alors on le crée
-					$logger -> info("\tCréation du répertoire".$logFolder." + chmod 770" );
-					mkdir "$raw_data/$dir/$logFolder" or $logger -> logdie("Impossible de créer le répertoire ".$logFolder );
-					chmod 0770, "$raw_data/$dir/$logFolder" or $logger -> logdie($!);
-				} else {
-					$logger -> info("\tLe répertoire ".$logFolder." existe déjé");
-				}
-			}
-			
-			###############################################################
-			#					DECOUPAGE SAMPLESHEET
-			###############################################################
-			$logger -> info("Découpe de ".$preSampleSheet) ;
-			my $laneExtraite = '';
-			my $counterIEMFiles = 0; #counter to store the number of IEM files found in the bulk file
-			my $IEMFileContent = '';
-			my $IEMFilePrefixe = $lastPSS;
-			$IEMFilePrefixe =~ s/BULKDEMUX/IEM/g; # Replace Bulk by IEM
-			$IEMFilePrefixe =~ s/.csv//g; # Supprime le .csv de la fin pour faciliter l'ajout du compteur de lanes
-			$IEMFilePrefixe .= '_Lane';
-		
-			open my $handle, '<', $preSampleSheet;
-			chomp(my @lines = <$handle>);
-			close $handle;
-			
-			foreach my $line (@lines) {
-				if ($line eq '[Header]'){
-					if($counterIEMFiles > 0){ # a 1st line  was already found and $IEMFileContent contains a single IEM file content
-						# ecriture du fichier
-						my $subSampleSheet = "$raw_data/$dir/${prefixLogFolder}${laneExtraite}/${IEMFilePrefixe}_IEM_Lane${laneExtraite}.csv";
-						print2file($IEMFileContent, $subSampleSheet);
-					}
-					$IEMFileContent = '';
-					$counterIEMFiles++;
-				}
-				$IEMFileContent .= $line."\n";
-				($laneExtraite) = $line =~ m/^(\d),/;
-				$laneExtraite = '1' if ($sequencer eq 'MiSeq' );
-			}
-			# ecriture du dernier fichier
-			my $subSampleSheet = "$raw_data/$dir/${prefixLogFolder}${laneExtraite}/${IEMFilePrefixe}_IEM_Lane${laneExtraite}.csv";
-			print2file($IEMFileContent, $subSampleSheet);
-		
-			# Désactivation de la SampleSheet
-			$logger -> info("Désactivation de la SampleSheet.");
-			move($lastPSS, $lastPSS.".old") or $logger -> logdie("Le renommage de ".$lastPSS." en .old est en erreur ".$!);
-			
-			###############################################################
-			#					INTEROP DANS NEXTCLOUD
-			###############################################################
-			if (!$checkTest){
-				# Récupération de l'année pour le répertoire de destination
-				my $year = "20".$annee;
-				
-				# Ecriture de la commande de synchronisation
-				my $aws_source = "$raw_data/$dir/";
-				my $aws_target = "s3://partage/externes/Illumina-SAV/$sequencer/$year/$dir"; #X:\partage\externes\Illumina-SAV\NovaSeq		[$#dir]
-				my $aws_prefixcmd = "aws s3 --endpoint-url https://s3r-tls.stockage.inra.fr";
-				
-				# Ecriture du script de lancement de synchronisation
-				my $aws_script_file = "scriptAWS_$sequencerID.sbatch";
-				my $aws_script = "#!/bin/sh \n";
-				$aws_script .= "#SBATCH -p wflowq\n#SBATCH -t 20\n#SBATCH --mem-per-cpu=200M\n";
-				$aws_script .= "#SBATCH -J $aws_script_file\n#SBATCH -e %x.e%j\n#SBATCH -o %x.o%j\n\n";
-				$aws_script .= "module load system/Python-3.6.7_shared\n";
-				$aws_script .= "$aws_prefixcmd sync $aws_source $aws_target ";
-				$aws_script .= "--exclude \"*\" --include \"[Rr]un[A-Za-z]*.xml\" --include \"InterOp/[A-Za-z]*.bin\" ";
-				$aws_script .= "--exclude \"InterOp/C[0-9]*.1*\"\n";
-				print2file($aws_script, "$aws_source/$aws_script_file");
-				
-				
-				# Lancement du script
-				my $sleepLastingForAWS = 300;
-				my $aws_launchcmd = "sbatch $aws_script_file";
-				my $aws_joboutput = `$aws_launchcmd`; $? and $logger -> logdie("Commande $aws_launchcmd impossible : ".$!);
-				my ($aws_jobID) = $aws_joboutput =~ m/Submitted batch job (\d+)/;
-				chomp($aws_jobID);
-				$logger -> info("\tDossier " . $aws_source." -> JobID : ".$aws_jobID."\nCommande exécutée : " . $aws_launchcmd );
-				
-				# Attente de la fin du job
-				my $boolOver = is_my_jobID_over($aws_jobID);
-				while (!$boolOver){
-					$boolOver = is_my_jobID_over($aws_jobID);
-					if (!$boolOver){
-						$logger -> info("\tEn attente de la fin de $aws_jobID, é dans ".($sleepLastingForAWS/60)." minutes!");
-						sleep($sleepLastingForAWS); # toutes les 5 minutes (*60 = 300)
-					}
-				}
-				
-				# Vérification qu'on est bon, sinon envoi d'un mail pour prévenir
-				if (-e $aws_script_file.".e".$aws_jobID){
-					$logger -> info("\tLe fichier d'erreur pour AWS existe bien!");
-					if (! -z $aws_script_file.".e".$aws_jobID){
-						my $testObjectPrefixe = $checkTest? "[TEST]" : "";
-						$logger -> error("\tLe fichier d'erreur pour AWS n'est pas vide, il a dé se passer quelque chose de louche, é investiguer!" );
-						my $mailRecipients = $checkTest? $mailTEST :'get-plage.bioinfo@genotoul.fr';
-						my $mailContent = "Une erreur est survenue lors de la copie des fichiers SAV vers CEPH avec la commande contenue dans\n${aws_source}${aws_script_file}.\n\n";
-						$mailContent .= "Le fichier d'erreur contient \n".`cat $aws_script_file.e$aws_jobID`;
-						send_and_check_my_email($mailContent, "${$testObjectPrefixe}Erreur sauvegarde SAV sur CEPH", $mailRecipients, $mailRecipients);
-					}else{
-						$logger -> info("\tLe fichier d'erreur pour AWS est vide, j'aime quand un plan se déroule sans accroc!");
-					}
-				}
-			} else { $logger -> info("Nous sommes en mode test : pas besoin de sauvegarder InterOp"); }
-
-			###############################################################
-			#					CREATION READSETS NGL-Bi
-			###############################################################
-=head1 A_SUPPRIMER
-			if ($runExistsInNGL){
-				# parcours des dossier PipelineLogs_Lane*
-				
-				# recherche du $NGLBiReadsetCreatedFile
-				## Si trouvé : on ne fait rien, les readsets existent deja
-				
-				
-				
-				
-				if (! -e $NGLBiReadsetCreatedFil){
-					# CREATION DES READSETS DANS NGL-BI	#   #   #   #   #   #   #   #   #   #   #
-					$logger -> info("Pas de fichier $NGLBiReadsetCreatedFil dans $raw_data/$dir -> Les readsets ne semblent ne pas exister dans NGL-Bi");
-				}
-			}
-=cut 
-
-			###############################################################
-			#					LANCEMENT DE NEXTFLOW
-			###############################################################
-			# création du dossier dans /work, se déplacer dedans et lancer nextflow
-					
-		} # Fichier de fin de run trouvé
-	} # fin parcours des répertoires
-}
-
-###################################################################
-#
-#						FONCTIONS
-#
-###################################################################
-
-sub print2file {
-	my ($content, $file2write) = @_;
-	my $logger = Log::Log4perl -> get_logger('print2file');
-	$logger -> info("\tEcriture du fichier $file2write");
-	open(my $fh, '>', $file2write) or exit 1;
-	print $fh $content;
-	close $fh;
-}
-
-sub check_my_samplesheet{
-	my ($file2check, $file2write) = @_;
-	my $logger = Log::Log4perl -> get_logger('check_my_samplesheet');
-
-	my $isfile2checkwindows;
-	my $isfile2checklinux;
-	
-	$logger -> info("Etude de $file2check");
-	if (-s $file2check){ # $file2check exists and has a non zero size
-		$logger -> info("Vérification des fins de ligne");
-		$isfile2checkwindows = is_my_file_Windows($file2check);
-		$logger -> info("Sortie de is_my_file_Windows : " . $isfile2checkwindows);
-		if ($isfile2checkwindows){
-			$logger -> warn($file2check." a des fins de ligne Windows : on le convertit!");
-			convert_file_2_linux($file2check);
-			my $isfile2checkwindows2 = is_my_file_Windows($file2check);
-			if ($isfile2checkwindows2){
-				$logger -> logdie("La conversion dos2linux n'a pas fonctionné!");
-			} else {
-				$logger -> info("La conversion dos2linux a fonctionné!");
-			}
-		}else {
-			$logger -> info("Donc fins de ligne de " . $file2check . " : Linux");
-		}
-		
-		$logger -> info("Etude de $file2write");
-		if(-s $file2write){# $file2write a une taille différente de 0 byte
-			if( $file2write eq $file2check ){#Fichier correct
-				$logger -> info($file2write." est déjé l'équivalent de ".$file2check.", on garde!");
-			}else{#Renommer le nouveau fichier CSV $file2write et l'ancien OLD_$file2write
-				chomp($file2check);
-				$logger -> info("Copie de ".$file2write." en OLD_$file2write");
-				cp($file2write,"OLD_$file2write") or $logger -> logdie("Impossible de copier le fichier ".$file2write);
-				$logger -> info("Copie de ".$file2check." en ".$file2write);
-				cp($file2check,$file2write)or $logger -> logdie("Impossible de copier le fichier ".$file2check);
-			}
-		}else{#Si $file2write est vide, on en fait une copie avec le nom correct
-			chomp($file2check);
-			$logger -> info("Copie de ".$file2check." en ".$file2write);
-			cp($file2check,$file2write)or $logger -> logdie("Impossible de copier le fichier ".$file2check);
-		}
-		return 1;
-	}else{
-		$logger -> info("Il n'y a pas de SampleSheet ".$file2check);
-		return 0;
-	}
-}
-
-# Récupere le code d'expérience NGL-SQ dans une samplesheet
-sub getNGLSeqExperimentCode{
-	my ($samplesheet) = @_;
-	my $logger = Log::Log4perl -> get_logger('getNGLSeqExperimentCode');
-	my $NGLSQExperimentCode = "";
-	my $experimentName_ligne = `grep "Experiment Name" $samplesheet | head -1` ;  $? and $logger -> logdie("Récupération de 'Experiment Name' dans '".$samplesheet."' en echec" );
-	($NGLSQExperimentCode) = $experimentName_ligne =~ m/Experiment Name,(.+)$/;
-	$logger -> info("NGLSQExperimentCode : ".$NGLSQExperimentCode);
-	$logger -> info("L'expérience ne sera pas rentrée dans NGL-Bi car pas de correspondance dans NGL-SQ") if($NGLSQExperimentCode eq '-');
-	$logger -> logdie("Echec de la récup du code d'expérience") if($NGLSQExperimentCode eq "");  
-	return $NGLSQExperimentCode;
-}
-
-# Charge les variables d'environnement du fichier de configuration NGL
-sub loadConfFile{
-	my $logger = Log::Log4perl -> get_logger('loadConfFile');
-	unless ($ENV{CONFFILE}) {
-		$logger -> logdie("$0: Database configuration file not defined ! Initialize 'CONFFILE' with configuration file path in your environment");
-	};
-	my $dbconf_file = $ENV{CONFFILE};
-	unless (-f $dbconf_file) {
-		$logger -> logdie("$0: Database configuration file not exist: $dbconf_file. It's necessary for continue");
-	};
-	open my $handle, '<', $dbconf_file;
-	chomp( my @lines = <$handle> );
-	close $handle;
-	foreach my $line (@lines) {
-		$line =~ s/#.*//o;
-		unless ($line) { next; }
-		if ($line =~ /(.*)=(.*)/o) {
-			my $key = $1;
-			my $value = $2;
-			$key =~ s/^\s*//o;
-			$key =~ s/\s*$//o;
-			$value =~ s/^\s*//o;
-			$value =~ s/\s*$//o;
-			$ENV{$key} = $value;
-		}else {
-			$logger -> logdie("$0: Can't load variable to database configuration file $dbconf_file in line: '$_'");
-		}
-	}
-}
-
-=head2 function is_my_file_Windows
-
-	Title		 : is_my_file_Windows
-	Usage		 : $boolean = is_my_file_Windows($file);
-	Prerequisite : None
-	Function	 : Retourne 0 si les fins de ligne du fichier sont linux, 1 si Windows
-	Returns	     : Nombre
-	Args		 : $file, string
-	Globals	     : none
-
-=cut
-
-sub is_my_file_Windows {
-	my ($file) = @_ ;
-	my $logger = Log::Log4perl -> get_logger('is_my_file_Windows');
-	$logger -> info("Fichier en entrée : " . $file);
-	my $fileOutput;
-	my $ismyfileWindows = 0;
-	
-	$fileOutput = `file $file`; $? and $logger -> logdie("[Erreur]Lancement de file");
-	chomp($fileOutput);
-	$logger -> info("Message de sortie : " . $fileOutput);
-	if ($fileOutput =~ /with CRLF.* line terminators/){
-		$logger -> info("Le fichier est Windows");
-		$ismyfileWindows = 1;
-	}
-	return $ismyfileWindows;	
-}
-
diff --git a/conf/base.config b/conf/base.config
index 158e3374d40d149e0c4f4be9f05cf88bdd51d1b9..0a6832f1daae4422ad7783c7ad2e5bc07d4af019 100644
--- a/conf/base.config
+++ b/conf/base.config
@@ -40,6 +40,11 @@ params {
 	// MethylSeq params
 	puc19 = ""
 	lambda = ""
+
+	// NGL
+	insert_to_ngl = true
+	bi_run_code = ''
+	sq_xp_code = ''
 }
 
 params.samplesheet = params.inputdir.toString() + "/SampleSheet.csv"
@@ -101,6 +106,7 @@ process {
 	cpus = 1
 	memory = 2.GB
 	beforeScript = 'sleep 5s; module purge'
+	clusterOptions = params.cluster_options
 	
 	errorStrategy = { task.exitStatus in [143,137,104,134,139,140] ? 'retry' : 'finish' }
 	maxRetries = 2
@@ -214,8 +220,6 @@ process {
 // ========================================
 //			   SHARED MODULES
 //=========================================
-params.shared_modules = '/home/sbsuser/work/Nextflow/shared_modules/ExportSources_Jules'
-
 process {
 	withName: SAMTOOLS_FAIDX {
 		beforeScript = "module purge"
@@ -284,4 +288,12 @@ process {
             overwrite: false
 	    ]
     }
+
+	withName: MD5SUM {
+		publishDir = [
+            path: { "${params.outdir}/fastq" },
+            mode: 'copy',
+            pattern: "*.md5sum"
+        ]
+	}
 }
\ No newline at end of file
diff --git a/conf/prod.config b/conf/prod.config
index 391ae6a5125a77d65ab408f2800c284b8365ad10..3dee02a8bfb1e9d73ae2b277f0f9eded2cbff689 100644
--- a/conf/prod.config
+++ b/conf/prod.config
@@ -1,12 +1,22 @@
-System.out.println "Chargement des paramètres de la config PROD"
+// ========================================
+//				PARAMS
+//=========================================
+params {
+	ngl_bi_client = '/home/sbsuser/save/scripts-ngs/NGL-Bi_client_Current'
+	shared_modules = '/home/sbsuser/save/scripts-ngs/shared_modules_Current'
+}
+
 // ========================================
 //				PROCESSES
 //=========================================
 process {
-	withLabel: ngl_bi {
-		executor = 'local'
-		beforeScript = "export NGL_BI_CLIENT='/save/sbsuser/scripts-ngs/NGL-Bi_client_Current'"
-		//errorStrategy = { 'ignore' }
+	withLabel: ngl {
+		beforeScript = "source ${params.ngl_bi_client}/GeT/bash/loadConfFile.sh ${params.ngl_bi_client}/IG/SystemeInteractionNGL-Bi/conf/prod_illumina_qc.conf"
+		publishDir = [
+            path: { "${params.outdir}/ngl" },
+            mode: 'copy',
+			pattern: "*.{log,created}"
+        ]
 	}
 	
 	withLabel: samtools {
diff --git a/conf/test.config b/conf/test.config
index 2d6b36e95a0b9397c3fa83d6a1f70edf45e4febd..7e37ac0ae723cb5c49e4f8e60f66443276473d19 100644
--- a/conf/test.config
+++ b/conf/test.config
@@ -1,11 +1,22 @@
+// ========================================
+//				PARAMS
+//=========================================
+params {
+	ngl_bi_client = '/home/sbsuser/work/test/jules/VisualStudioSources/ngl-bi_client/'
+	shared_modules = '/home/sbsuser/work/Nextflow/shared_modules/ExportSources_Jules/'
+}
+
 // ========================================
 //				PROCESSES
 //=========================================
 process {
-	withLabel: ngl_bi {
-		executor = 'local'
-		beforeScript = "export NGL_BI_CLIENT='/work/sbsuser/test/jules/VisualStudioSources/ngl-bi_client'"	// test
-		//errorStrategy = { 'ignore' }
+	withLabel: ngl {
+		beforeScript = "source ${params.ngl_bi_client}/GeT/bash/loadConfFile.sh ${params.ngl_bi_client}/IG/SystemeInteractionNGL-Bi/conf/dev_illumina_qc.conf"
+		publishDir = [
+            path: { "${params.outdir}/ngl" },
+            mode: 'copy',
+			pattern: "*.{log,created}"
+        ]
 	}
 	
 	withLabel: samtools {
diff --git a/nextflow.config b/nextflow.config
index 87c17e13fb05c1ee3bc24f02ea5ece2b89d2eb89..529dca9e170c4111b49e5fb19793412012357e57 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -31,6 +31,8 @@ params {
 	//email_labo="get-plage.labo@genotoul.fr"
 	email_labo=""
 
+	cluster_options = ''
+
 	monochrome_logs = true
 	help = false
 	
diff --git a/sub-workflows/local/begin_nglbi.nf b/sub-workflows/local/begin_nglbi.nf
new file mode 100644
index 0000000000000000000000000000000000000000..0473f635a5d8364db55e484e91a9c009b43d3aa4
--- /dev/null
+++ b/sub-workflows/local/begin_nglbi.nf
@@ -0,0 +1,67 @@
+// -------------------------------------------------
+// 					BEGIN NGL-BI
+// -------------------------------------------------
+/*
+ * Subworkflow to prepare NGL-Bi process
+ * creation of the Run if needed
+ * creation of readsets
+ * change of status
+*/
+
+// -------------------------------------------------
+// 					MODULES
+// -------------------------------------------------
+
+include {	CREATE_RUN;
+            UPDATE_NGLBI_STATE_FROM_CODE as UPDATE_STATE_FS;
+			UPDATE_NGLBI_STATE_FROM_CODE as UPDATE_STATE_IPRG;
+			UPDATE_NGLBI_STATE_FROM_FILE as UPDATE_STATE_FRG;
+			CREATE_READSETS;
+} from "${params.shared_modules}/ngl_bi.nf"
+
+
+// -------------------------------------------------
+// 					LOCAL PARAMS
+// -------------------------------------------------
+
+
+// -------------------------------------------------
+// 					WORKFLOW
+// -------------------------------------------------
+
+workflow NGLBI {
+    main:
+        // Creation of the Run if needed
+        if (params.insert_to_ngl && params.bi_run_code == '') {
+
+            CREATE_RUN(params.sequencer, params.sqXpCode, '', 1)
+
+            params.bi_run_code = CREATE_RUN.out.createdFile.splitText().map{it -> it.trim()}
+            ready_for_state = CREATE_RUN.out.ready
+        } else {
+            ready_for_state = Channel.value(1)
+        }
+
+        // Update run state
+		UPDATE_STATE_FS(params.bi_run_code, 'F-S', ready_for_state)
+		UPDATE_STATE_IPRG(params.bi_run_code, 'IP-RG', UPDATE_STATE_FS.out.ready)
+
+        // Creation of ReadSets
+		CREATE_READSETS(
+			params.sq_xp_code,
+			params.bi_run_code,
+			'',
+			params.lane,
+			UPDATE_STATE_IPRG.out.ready
+		)
+
+        // Update readset states
+		UPDATE_STATE_FRG(CREATE_READSETS.out.createdFile, 'F-RG', CREATE_READSETS.out.ready)
+
+    emit:
+        ready = UPDATE_STATE_FRG.out.ready
+		readsetsFile = CREATE_READSETS.out.createdFile
+
+}
+
+
diff --git a/sub-workflows/local/core_pipeline.nf b/sub-workflows/local/core_pipeline.nf
index 6fc801c9b7b18440573b69ab828f51cb88d23044..25787334c1fc27fae2db6bb1ee42d6120bc886e7 100644
--- a/sub-workflows/local/core_pipeline.nf
+++ b/sub-workflows/local/core_pipeline.nf
@@ -21,14 +21,9 @@ include {
 	FASTQSCREEN;
 	DUPLICATED_READS;
 } from "$baseDir/modules/local/module_core.nf"
-
-include {
-	prepareReadSetCreation;
-	readsetNGLBiCreation as readsetCreation;
-} from "$baseDir/modules/local/module_NGL-Bi.nf"
-
 include { GUNZIP	} from "${params.shared_modules}/gzip.nf"
 include { SEQTK_SAMPLE } from "${params.shared_modules}/seqtk.nf"
+include { md5sum as MD5SUM	} from "${params.shared_modules}/md5sum.nf"
 //-------------------------------------------------
 
 inNGL=true
@@ -36,36 +31,14 @@ forceNewReadset=false
 isResume=workflow.resume
 
 //-------------------------------------------------
-
-workflow NGLBi_readsets {
-	/*
-	 * Creation readsets NGL-Bi -> oui !!
-	 * Sauvegarde NextCloud -> non
-	 */
-	take:
-		sampleSheet
-		runNGLBiCreated
-		
-	main:
-	//if inNGL && (!isResume || forceNewReadset) {
-		prepareReadSetCreation(sampleSheet, runNGLBiCreated)
-		readsetCreation(prepareReadSetCreation.out)
-		checkError(readsetNGLBiCreation.out.readSetLog)
-	//}
-}
-
-
 workflow CORE {
 	take:
 		ch_sampleSheet
-		//ch_runNGLBiCreated
 		ch_DemuxStatXML
 		ch_DemuxSummary
 		ch_read
 		
-	main:
-		//NGLBi_readsets(ch_sampleSheet, ch_runNGLBiCreated)	// Fait dans NGS_Illumina, à voir plus tard pour le déplacer ici
-		
+	main:		
 		// ----------- DemultiplexStat
 		extractInfoForDemuxStats(ch_sampleSheet)
 		demultiplexStats(ch_DemuxStatXML, extractInfoForDemuxStats.out, ch_DemuxSummary)
@@ -78,6 +51,9 @@ workflow CORE {
 			illuminaFilter(ch_read)
 			ch_read_good = illuminaFilter.out.reads
 		}
+
+		// ----------- md5sum
+		MD5SUM(ch_read_good.collect{it[1]}.flatten().collect(), params.run_name+'_fastq')
 		
 		// ----------- FASTQC
 		FASTQC(ch_read_good)
diff --git a/workflow/illumina_qc.nf b/workflow/illumina_qc.nf
index fb702cc87555f4501255fbbf1336ce9d05e3733b..1c3ba605d3d64d9d2d44dc3afca33d1d25c7fef9 100644
--- a/workflow/illumina_qc.nf
+++ b/workflow/illumina_qc.nf
@@ -57,11 +57,15 @@ createDir = file(params.outdir).mkdir()
 // -------------------------------------------------
 // 					INCLUDES
 // -------------------------------------------------
+include { NGLBI			} from "$baseDir/sub-workflows/local/begin_nglbi.nf"
 include { CORE			} from "$baseDir/sub-workflows/local/core_pipeline.nf"
 include { DNA_QC		} from "$baseDir/sub-workflows/local/dna_qc.nf"
 include { RNA_QC		} from "$baseDir/sub-workflows/local/rna_qc.nf"
 include { MULTIQC		} from "${params.shared_modules}/multiqc.nf"
 include { workflow_summary as WORKFLOW_SUMMARY } from "${params.shared_modules}/workflow_summary.nf"
+include { UPDATE_NGLBI_STATE_FROM_FILE as UPDATE_STATE_IPQC;
+		  UPDATE_NGLBI_STATE_FROM_FILE as UPDATE_STATE_FQC
+						} from "${params.shared_modules}/ngl_bi.nf"
 
 // -------------------------------------------------
 // 					 EMAIL ON START
@@ -76,6 +80,11 @@ sendBeginMail(format.format(new Date()))
 workflow ILLUMINA_QC {
 	ch_mqc = Channel.empty()
 	WORKFLOW_SUMMARY()
+	NGLBI()
+
+	if (params.insert_to_ngl){
+		UPDATE_STATE_IPQC(NGLBI.out.readsetsFile, 'IP-QC', NGLBI.out.ready)
+	}
 
 	CORE(ch_ss, ch_DemuxStatXML, ch_DemuxSummary, ch_read)		/*ch_ngl, ch_runInfo, mismatchNumber,  params.raw_data*/
 
@@ -104,6 +113,11 @@ workflow ILLUMINA_QC {
 			ch_mqc.collect().ifEmpty([])
 		).collect()
 	)
+
+	if (params.insert_to_ngl){
+		UPDATE_STATE_FQC(NGLBI.out.readsetsFile, 'F-QC', MULTIQC.out.html)
+	}
+
 	/*
 		if overlap, alors :
 			diversity_qc sub-workflow