#!/usr/bin/perl -w

use strict;

print STDERR "--Identificacio de motius conservats en sequencies per mitja d'expressions regulars--", "\n";
print STDERR "Jesus Bertran Gonzalez i Miriam Sanchez Matamales", "\t", "UPF Barcelona", "\n";


###########################################################################################################
######################################DECLARACIO DE VARIABLES##############################################
###########################################################################################################

my $sequencies;                          #sequencies a analitzar en format FASTA
my $patro;                               #patro que hem de trobar a les sequencies 
my $primera_linia;
my $i;
my $j;
my $seq_matriu;
my $longprot;                            #longitut total de la proteina
my $longprev;                            #lloc on comença el motiu
my $longmotiu;                           #longitut total del motiu
my $longpost;                            #lloc on acaba el motiu
my $nummatch;                            #nombre total de sequencies amb match
my $numprotllista;                       #nombre total de sequencies al fitxer
my $seq_parcial;                         
my $posicio;
my $totalmatch;                          #nombre total de match al fitxer

my @v;
my @seq_matriu;                          #matriu on tenim descripcio de la sequencia a la 1a columna i la seq a la 2a columna


##########################################################################################################
#####################################  OBERTURA D'ARXIUS  ################################################
##########################################################################################################

# Comprovem  que l'usuari ha introduit els dos arguments necessaris a la linia de comandes: el fitxer on estan les sequencies
# en format FASTA i el motiu a trobar  entre cometes 

if (scalar(@ARGV)<2){
    print STDERR "USUARI: assegura't que has introduit el fitxer de sequencies i el motiu entre cometes \n";
    exit(1);
};

$sequencies=$ARGV[0];
$patro=$ARGV[1];


# obrim l'arxiu des del shell i el passem al programa

open (SEQ,"<$sequencies") || do {
    print STDERR "No s'ha trobat l'arxiu que conte les sequencies\n";
    exit(1);
};


# obrim un arxiu per escriure els resultats"
open(OUTFILE, "> outfile.txt");



###########################################################################################################
#############################  PREPARACIO DE LA MATRIU DE SEQUENCIES  #####################################
###########################################################################################################

# Crearem una matriu de sequencies a partir de l'arxiu en format fASTA (a $sequencies) per tal de tenir:

# - Primera columna: identificador de la sequencia a [$i][0]
# - Segona columna: string (sequencia continua) a [$i][1]

$/='>';
$primera_linia= <SEQ>;
$i= 0;


while (<SEQ>) {
    chomp;
    @v= split (/\n/,$_);
    $seq_matriu [$i][0]= $v[0];

    $j=1;
    $seq_matriu [$i][1]= '';
    
    while ($j<scalar(@v)) {
	$seq_matriu [$i][1]= $seq_matriu [$i][1].$v[$j];
	
	$j=$j+1;

    }
    $i=$i+1;
    
}


close (SEQ);



############################################################################################################
#####################################  ALGORITME PEL MATCH  ################################################
############################################################################################################

# Dins la matriu, recorrerem la sequencia per trobar matches amb un patro determinat fins que s'acabin les 
# sequencies. Com a resultat obtindrem un ouput de totes les sequencies que tenen un match on:
# - primera columna: descripcio de la seq 
# - segona: el motiu amb que ha fet match 
# - tercera: es la posicio d'inici del match 
# - quarta: el final del match
# - cinquena: longitut total de la proteina. 
# Tambe ens dira el nombre total de sequencies que tenen algun motiu respecte del total de sequencies i el nombre total de motius 
# al fitxer.  

$i=0;
$longprot=0;
$longprev=0;
$longmotiu=0;
$longpost=0;
$nummatch=0;
$numprotllista=0;
$seq_parcial=0;
$posicio=0;
$totalmatch=0;


while ($i<scalar(@seq_matriu)){
   
    if ($seq_matriu[$i][1]=~m/($patro)/i){

	$longprot =length ($seq_matriu [$i][1]);
	
	$posicio=0;
	
	while ($posicio<$longprot){
	  $seq_parcial= substr($seq_matriu[$i][1],$posicio, 28);
	  $longprev = index($seq_matriu[$i][1],$seq_parcial); 

	 
	    if($seq_parcial=~m/^($patro)/i){

						
		print OUTFILE $seq_matriu [$i][0] . "\t";
		print OUTFILE $1 . "\t";
		print OUTFILE $longprev . "\t";
		$longmotiu=length $1;
		$longpost=$longprev+$longmotiu;
		print OUTFILE $longpost . "\t";
		print OUTFILE $longprot . "\n";
		
		$totalmatch=$totalmatch+1;
	    }
	    $posicio=$posicio+1;
	}

	$nummatch=$nummatch+1;
    }
    
    $numprotllista=$numprotllista+1;

    $i=$i+1;
}


print OUTFILE "Nombre total de sequencies amb motiu: $nummatch de $numprotllista\n";
print OUTFILE "Nombre total de motius l'arxiu: $totalmatch\n";       
close OUTFILE;    

