# # (gH)   -_-  convertSra.pl  ;  TimeStamp (unix) : 14 Juin 2016 vers 18:20

#################################################################################
#
# this script uncompress all the .sra files in the current directory
#
#
#################################################################################

print "\n convertSra.pl (gH) version 1.03\n" ;

use strict ;
use warnings ;
use POSIX qw/ceil/;

# store date and time to be able to compute duration

my $date1 = &dateEtHeure() ;
my $time1 = time() ;
system("echo $date1 > time.start") ;

####################################################################
####################################################################

# 1. get the name and size of all the .sra files in the current directory

####################################################################
####################################################################

my $curDir = `pwd` ;
chomp $curDir ;

print "\n" ;
print " 1. retrieving the file names and sizes in $curDir.\n\n" ;
print "\n" ;

my $expsFile = "sizes_and_reads.txt" ;

open(ESFILE,">$expsFile") or die ("\n\n! Unable to write to $expsFile\n\n") ;
print ESFILE "Start: ".&dateEtHeure()."\n" ;

my @files = `find *.SRA *.sra 2> /dev/null ` ;

my $nbf = @files ; # nombre de fichiers

my $idf = 0 ;
foreach my $file (sort @files) {
  $idf++;
  chomp($file) ;
  my $fileSize = -s $file ;
  print "  file ".sprintf("%4d",$idf)." / $nbf : ".sprintf("%15s",$file) ;
  my $tailleh =  &tailleH($fileSize) ;
  print sprintf("%12s",$fileSize) ;
  print sprintf("%10s",$tailleh) ;
  print "\n" ;
} ; # fin de foreach

####################################################################
####################################################################

# 2. uncompress all the .sra files

####################################################################
####################################################################

print "\n" ;
print " 2. uncompressing the $nbf files in $curDir.\n\n" ;
print "\n" ;

my $fqDump = "fastq-dump_log.txt" ;
$idf = 0 ;
foreach my $file (sort @files) {
  $idf++;
  chomp($file) ;
  print &dateEtHeure()."  file ".sprintf("%4d",$idf)." / $nbf : ".sprintf("%15s",$file) ;
  `fastq-dump --split-files ./$file > $fqDump ` ;
  `cat $fqDump` ;
  open(FQDUMP,"<$fqDump")  or die ("\n\n! Unable to read from $fqDump\n\n") ;
  while(my $lig = <FQDUMP>) {
    my @tdm = split(/\s+/,$lig) ;
    print("   ".$tdm[0]) ;
    print(sprintf("%15d",$tdm[1])) ;
    print("   ".$tdm[2]) ;
  } ; # fin tant que
  close(FQDUMP) ;
  print "\n" ;
} ; # fin de foreach

print ESFILE "-- all $nbf files uncompressed.\n" ;
print ESFILE "End: ".&dateEtHeure()."\n" ;
close(ESFILE) ;

print "\n you can consult $expsFile to check the size of the files.\n\n" ;

####################################################################
####################################################################

# at last, compute global duration

print "\n" ;
my $date2 = &dateEtHeure() ;
system("echo $date2 >  time.stop") ;
my $time2 = time() ;
my $duree = $time2 - $time1 ;
print " Start: $date1 ; end: $date2 ; elapsed time: $duree sec" ;
if ($duree>60) {
  print " (" ;
  my $hrs = int($duree/(24*60.0)) ;
  if ($hrs>0) {
    print "$hrs h " ;
  } ; # fin si
  my $rst = $duree - (24*60.0)*$hrs ;
  my $min = int($rst / 60.0) ;
  my $sec = $rst - 60* $min ;
  print "$min min $sec sec)" ;
} ; # fin si
print ".\n" ;
exit(-1) ;

####################################################################
####################################################################

sub dateEtHeure {

####################################################################

    my ($sec,$min,$hour,$mday,$mmon,$year)=localtime();
    $mmon = $mmon + 1 ;
    $year = $year + 1900 ;
    if (length($sec)<2)  { $sec = "0$sec"   } ;
    if (length($min)<2)  { $min = "0$min"   } ;
    if (length($mday)<2) { $mday = "0$mday" } ;
    if (length($mmon)<2) { $mmon = "0$mmon" } ;
    my $now  = $mday."/".$mmon."/".$year;
    $now .= " ".$hour.":".$min.".".$sec ;

    return $now ;

} ; # fin sub dateEtHeure

####################################################################

sub tailleH {

# affiche lisiblement une taille de fichier

my $nbOctets = $_[0] ;

my @lstUnit = ("","kO","Mo","Go","To","Po") ;

my $p       = 1 ;
my $basep   = 1024 ;
my $limInf  = 1 ;
my $limSup  = $basep**$p ;
my $idu     =  0 ;

while ($nbOctets>$limSup) {
#cat("p=",p," : ",nbOctets,">",limSup,"\n")
#cat("limInf",limInf,",","limSup",limSup,"\n")
#cat("n/limInf",nbOctets/limInf,"\n")
  $idu     = $idu + 1 ;
  $p       = $p+1     ;
  $limInf  = $limSup   ;
  $limSup  = $basep**$p ;
} ; # fin tant que

#cat("donc p=",p," : ",nbOctets,"<",limSup," et idu vaut ",idu,"\n")
#cat("n/limInf",nbOctets/limInf,"\n")
my $th = ($nbOctets*1.0)/$limInf ;
#cat("th=",th,"\n")
$th  = ceil($th) ;
$th .= " $lstUnit[$idu]" ;

return($th)

} ; # fin sub dateEtHeure

####################################################################
#
# normal end of script
#
####################################################################
