#!/usr/bin/perl

#/*******************************************************************************
# * Contributors:
# *    Susanna Zucca, Margherita Villaraggia - susanna.zucca(at)unipv.it
# *******************************************************************************/


#==============================================================================
#title           :print_primer_seq.pl
#description     :This script taks as input Illumina Manifest File and provides as output two txt files containing the list of ULSO and DLSO primers.
#authors         :Susanna Zucca, Margherita Villaraggia
#date            :20160216
#version         :1.0   
#usage		 :perl print_primer_seq.pl /Path/to/Manifest.txt
#example      	 :perl print_primer_seq.pl Example_manifest.txt
#==============================================================================
use strict;
use warnings;

#==============================================================================
#IMPORT MANIFEST FILE DATA
#==============================================================================

my $num_args = $#ARGV + 1;
if ($num_args != 1) {
    print "\nUsage: print_primer_seq.pl \nManifest_file\n";
    exit;
}


my $file_in=$ARGV[0];
my $primer_file_R1=$file_in."_Primer_R1.txt";
my $primer_file_R2=$file_in."_Primer_R2.txt";



open (FILE, ">$primer_file_R2");
open (FILERC, ">$primer_file_R1");
open (INPUT, "$file_in");

my @input=<INPUT>;	

#==============================================================================
#SELECT PRIMERS FROM MANIFEST
#==============================================================================
my $i=0;
my $li=@input;
my $ind_probe=0;
my $ind_target=0;
for ($i=0;$i<$li;$i++){
if ($input[$i]=~/^.Probes/){
$ind_probe=$i+2;	
}
if ($input[$i]=~/^.Targets/){
$ind_target=$i+2;	
}
} 


my $target_region_name;
my $target_regionID;
my $targetID;
my $species;
my $buildID;
my $chr;
my $start_pos;
my $end_pos;
my $target_reg_strand;
my $ULSO;
my $ULSO_hits;
my $DLSO;
my $DLSO_hits;
my @tarID=();	


my $j=0;
my @elencoULSO=();	
my @elencoDLSO=();	
my @start_probe=();
my @end_probe=();
my @chr_probe=();
my @tar_reg_strand=();
my $ep=0;

for ($j=$ind_probe;$j<($ind_target-2);$j++){
($target_region_name,$target_regionID,$targetID,$species,$buildID,$chr,$start_pos,$end_pos,$target_reg_strand,$ULSO,$ULSO_hits,$DLSO,$DLSO_hits)=split('\t', $input[$j]);
$elencoULSO[$ep]=$ULSO;
$elencoDLSO[$ep]=$DLSO;
$start_probe[$ep]=$start_pos;
$end_probe[$ep]=$end_pos;
$chr_probe[$ep]=$chr;
$tarID[$ep]=$targetID;	
$tar_reg_strand[$ep]=$target_reg_strand;
$ep++;
}

#==============================================================================
#INITIALIZE ULSO AND DLSO ARRAYS
#==============================================================================
my @ULSO=();
my @DLSO=();

my $rc=0;
my $lrc=@elencoULSO;
my $seqU='';
my $seqD='';

for ($rc=0;$rc<$lrc;$rc++){
$seqU=$elencoULSO[$rc];
$seqD=$elencoDLSO[$rc];
$ULSO[$rc]=$seqU;
$DLSO[$rc]=$seqD;
$ULSO[$rc]=~tr/A T C G/T A G C/;
$DLSO[$rc]=~tr/A T C G/T A G C/;
$ULSO[$rc]=reverse($ULSO[$rc]);
$DLSO[$rc]=reverse($DLSO[$rc]);

} 

#==============================================================================
#SEQUENCE RETRIEVAL
#==============================================================================
my $targetA;
my $targetB;
my $target_num;
my $chr_tar;
my $start_tar;
my $end_tar;
my $probe_strand;
my $sequence;
my @elenco_sequence=();
my @start_seq=();
my @end_seq=();
my @chr_seq=();
my @tarA=();
my @tarB=();
my $es=0;
my $k=0;
my $lk=@input;
for ($k=$ind_target;$k<$lk;$k++){
($targetA,$targetB,$target_num,$chr_tar,$start_tar,$end_tar,$probe_strand,$sequence)=split('\t',$input[$k]);
$elenco_sequence[$es]=$sequence;
$start_seq[$es]=$start_tar;
$end_seq[$es]=$end_tar;
$chr_seq[$es]=$chr_tar;
$tarA[$es]=$targetA;
$tarB[$es]=$targetB;
$es++;
}

my $len_tar_ID=@tarID;

my $len_seq=@elenco_sequence;


#==============================================================================
#PRINT OUTPUT
#==============================================================================
my $s=0;
my $ls=@elenco_sequence;
my $d=0;
my $ld=@ULSO;
my @indice=();

print FILE "Chr\tStart\tEnd\tULSO\tDLSO\tChr\tStart\tEnd\tSequence\tSubmitted Target Region Strand\tTarget ID\n";
print FILERC "Chr\tStart\tEnd\tULSO\tDLSO\tChr\tStart\tEnd\tSequence\tSubmitted Target Region Strand\tTarget ID\n";
for ($s=0;$s<$ls;$s++){

if ($tarA[$s] eq $tarB[$s]){
@indice=();
#==============================================================================
#LOOK FOR PRIMERS OF THE SAME PAIR (VIA ID MATCH)
#If IDs do not match, primer pair is discarded
#==============================================================================
(@indice)=grep { $tarID[$_] eq $tarA[$s] } 0..$#tarID;	


my $t=0;
my $lt=@indice;
for ($t=0;$t<$lt;$t++){

}
if (@indice){

print FILE "$chr_probe[$indice[0]]\t$start_probe[$indice[0]]\t$end_probe[$indice[0]]\t$elencoULSO[$indice[0]]\t$elencoDLSO[$indice[0]]\t$chr_seq[$s]\t$start_seq[$s]\t$end_seq[$s]\t$elenco_sequence[$s]\t$tar_reg_strand[$indice[0]]\t$tarID[$indice[0]]\n";
print FILERC "$chr_probe[$indice[0]]\t$start_probe[$indice[0]]\t$end_probe[$indice[0]]\t$ULSO[$indice[0]]\t$DLSO[$indice[0]]\t$chr_seq[$s]\t$start_seq[$s]\t$end_seq[$s]\t$elenco_sequence[$s]\t$tar_reg_strand[$indice[0]]\t$tarID[$indice[0]]\n";
}
} 
else {

print "WARNING: non mathcing IDs!\n";
}
}


close FILE;
close FILERC;
close INPUT;



