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