#!/usr/bin/perl -w

# usage : perl sm_mothur_preprocess_1_myseq.pl <input FASTA> <input config txt>
# 02/08/2013 - Wrapper dans le cadre du projet 16S (pour Maria B.)

use strict;
use File::Basename;
use Getopt::Long;

#    
#     #for $q in $input_fastq
#           --fastq ${q.fastq}
#           --name ${q.fastq.name}
#     #end for
#     #if $adapter_selector.adapter_choice=="yes":
#	   --adapter $adapter_selector.adapter
#    #end if

#my @all_parameters=();
#my @fastq_files;
#my @names;
#my $min_length; --minlength $minlength 
#my $adapter=undef;
#my $cleaned_sequences_file; --cleanedsequences $cleanedsequences
#my $matrix_file; --matrix $matrix
#my %names_fastq;



my $input_config;
my $EXT;
my $TRIM_BARCODE;
my $multiplexbmm;
my $multiplexpmm;
my $output_fasta;
my $output_table;
my $output_html;
my $MAKE_CONTIG;
my $multiplexread1; #$multiplex.read1
my $multiplexread2; #$multiplex.read2
my $inputfastqspath; #$input_fastas_path
my $makecontigmaxamb; #$makecontig.MAX_AMB
my $makecontigmaxlen;  #$makecontig.MAX_LEN

Getopt::Long::Configure( 'no_ignorecase', 'bundling' );
GetOptions (
    'input_config=s' => \$input_config,
    'ext=s' => \$EXT,
    'trimbarcode=i' => \$TRIM_BARCODE,
    'multiplexbmm=i' => \$multiplexbmm,
    'multiplexpmm=i' => \$multiplexpmm,
    'output_fasta=s' => \$output_fasta,
    'output_table=s' => \$output_table,
    'output_html=s' => \$output_html,
    'MAKE_CONTIG=i' => \$MAKE_CONTIG,
    'multiplexread1=s' => \$multiplexread1,
    'multiplexread2=s' => \$multiplexread2,
    'inputfastqspath=s' => \$inputfastqspath,
    'makecontigmaxamb=i' => \$makecontigmaxamb,
    'makecontigmaxlen=i' => \$makecontigmaxlen
) or die "Usage: Error in command line arguments\n";


#Getopt::Long::Configure( 'no_ignorecase', 'bundling' );
#GetOptions (
#    'minlength=i' => \$min_length,
#	'adapter=s' => \$adapter,
#	'fastq=s@' => \@fastq_files,
#	'name=s@' => \@names,
#	'cleanedsequences=s' => \$cleaned_sequences_file,
#	'matrix=s' => \$matrix_file
#) or die "Usage: Error in command line arguments\n";


#my $MOTHUR1 = '/save/galaxy/scripts/sm_mothur/1_preprocess_miseq_mothur1.0.sh'; 
my $MOTHUR1 = '/usr/local/bioinfo/src/galaxy-dev/galaxy-dist/tools/sm_mothur/bin/1_preprocess_miseq_mothur1.1.sh'; 
my $cmd = ''; my $cmd2 ='';my $cmd3 ='';
my $cmdLNS ='';

#my $path= dirname($input_config);
my ($nb) = ($output_html=~/galaxy_dataset_(\d+)\.\S+$/);

#Repertoire de sortie cree par le script, verif des droits d'ecriture sur ce repertoire de sortie
#Comme on en avait discuté, je pars du principe que dans ce dossier il y a déjà un dossier "data" qui contient les fichiers pairés à analyser.
`cd /galaxydata/database/files/workspace/; mkdir $nb/; chmod 777 $nb/; cd $nb/; mkdir data/; chmod 777 data/;`;
my $dirresults= "/galaxydata/database/files/workspace/".$nb;


#recupération du fichier de configuration avec modification de l extension
`cp $input_config $dirresults/config.txt;`;
#converting file config.txt to UNIX format ...
my $cmdconvert ='';
$cmdconvert = "(/usr/bin/dos2unix $dirresults/config.txt;) >& ./dos2unix.log 2>&1";
system $cmdconvert;  

if ($TRIM_BARCODE == "1"){
    #si on est dans le cas de données non démultipléxés (TRIM_BARCODE à 1): à ce moment là l'utilisateur à charger read1 read2 en paramètre, il suffit de faire un lien de ces fichiers dans le dossier data
    #avec modification de l extension des inputs
    `ln -s $multiplexread1 $dirresults/data/READ1.$EXT;ln -s $multiplexread2 $dirresults/data/READ2.$EXT;`;
    $cmd = "(cd $dirresults; sh $MOTHUR1 $dirresults $dirresults/config.txt $EXT $TRIM_BARCODE $dirresults/data/READ1.$EXT $dirresults/data/READ2.$EXT $multiplexbmm $multiplexpmm $MAKE_CONTIG $makecontigmaxamb $makecontigmaxlen) >& ./mothurmyseq1.log 2>&1";
    system $cmd;  
    #Info pour les biologistes
    print STDOUT "Step 1)a) - Pre-process Mothur MiSeq : \n\n $cmd \n\n ";
}
else
{
    #si on est dans le cas de données démultipléxés (TRIM_BARCODE à 0 et MAKE_CONTIG à 1) : à ce moment là l'utilisateur charge une archive et tu décompresse dans data, soit il indique un chemin genotoul et tu fais des liens vers le dossier data.
    my $cmdLNS = '';
    #Creation des liens symboliques
    $cmdLNS = "ln -s $inputfastqspath/*.$EXT $dirresults/data/. >& ./mothur_lns.log 2>&1";
    system $cmdLNS;
    #Info pour les biologistes
    print STDOUT "Creation des liens symboliques : \n\n $cmdLNS \n\n ";
            if ($MAKE_CONTIG =="1"){
            $cmd2 = "(cd $dirresults; sh $MOTHUR1 $dirresults $dirresults/config.txt $EXT $TRIM_BARCODE $MAKE_CONTIG $makecontigmaxamb $makecontigmaxlen) >& ./mothurmyseq2.log 2>&1";
            system $cmd2;
            #Info pour les biologistes
            print STDOUT "Step 1)b) - Pre-process Mothur MiSeq : \n\n $cmd2 \n\n ";
           }else{
            $cmd3 = "(cd $dirresults; sh $MOTHUR1 $dirresults $dirresults/config.txt $EXT) >& ./mothurmyseq3.log 2>&1";
            system $cmd3;
            #Info pour les biologistes
            print STDOUT "Step 1)c) - Pre-process Mothur MiSeq : \n\n $cmd3 \n\n ";
           }
}

#Pour le moment je ne gère pas la possibilité de donner des contigs (1 fichier par échantillon fasta ou fastq). On verra ça plus tard.
#dans le script je me charge de faire le dézippage si nécessaire, ensuite je constitue les contigs, et je fais un certains nombre de filtre.
#J'ai des commandes qui sont lancées en qarray j'espère que ça va le faire, je leur ai donné un nom genre "Galaxy_MiSeq_step1_[nom_etape]" mais je gères la récupération des identifiants de job (thanks to Patrice).
#A la fin quand tout est bien terminé je fais les rm des fichiers intermédiaires.


#TESTS commande : perl sm_mothur_preprocess_1_myseq.pl /usr/local/bioinfo/src/galaxy/galaxy-dist/tools/sm_mothur/tests2/batch1_16S_extract.fasta /usr/local/bioinfo/src/galaxy/galaxy-dist/tools/sm_mothur/tests2/454_Thailande_2013_16S_correct.txt 0 0 4 1 200 outgz outfasta outgroups outhtmlgalaxy_dataset_123 outnames
#mkdir out/; chmod 777 out/; cd out/; sh /home/sigenae/bin/Galaxy/r454_diversity_Galaxy/1_preprocess_mothur1.1.sh /usr/local/bioinfo/src/galaxy/galaxy-dist/tools/sm_mothur/tests2/batch1_16S_extract.fasta  /usr/local/bioinfo/src/galaxy/galaxy-dist/tools/sm_mothur/out/ /usr/local/bioinfo/src/galaxy/galaxy-dist/tools/sm_mothur/tests2/454_Thailande_2013_16S_correct.txt 0 0 4 1 200
#sh 1_preprocess_miseq_mothur1.0.sh path_to_OUTDIR path_to_SAMPLE_CONF EXT TRIM_BARCODE [READ1 READ2 B_MM P_MM] MAKE_CONTIG MAX_AMB MAX_LEN
#comme pour le 454, dans le wrapper il faudrait que tu crée le dossier de sortie path_to_OUTDIR, et que tu t'y place.
#$cmd = "(cd $dirresults; sh $MOTHUR1 $dirresults $input_config $EXT $TRIM_BARCODE [READ1 READ2 B_MM P_MM] $MAKE_CONTIG $MAX_AMB $MAX_LEN) >& ./mothur1.log 2>&1";
#system $cmd;




#Recuperation des fichiers par Galaxy
#- un fichier bilan.html, tu peux l'appeler 1_preprocess_miseq_bilan.html ?
#- des fichiers de sorties qui serviront au module 2 : all.final.contigs.fasta et all.final.contigs.count_table
#et voila, dans le dossier il y a aussi une archive individuals_contigs.tgz, mais je fais un lien dans le bilan.html pour pouvoir la télécharger, et un fichier contigs.size.distrib.jpg pareil incorporé dans le fichier html.


if (! -e "$dirresults/all.final.contigs.fasta"){print STDERR "all.final.contigs.fasta not found. \n";}else{`cp -a $dirresults/all.final.contigs.fasta $output_fasta`;}
if (! -e "$dirresults/all.final.contigs.count_table"){print STDERR "all.final.contigs.count_table not found. \n";}else{`cp -a $dirresults/all.final.contigs.count_table $output_table`;}
if (! -e "$dirresults/bilan.html"){print STDERR "bilan.html file not found. \n";}else{`cp -a $dirresults/bilan.html $output_html`;}
