Mercurial > repos > xuebing > sharplabtool
diff tools/new_operations/tables_arithmetic_operations.pl @ 0:9071e359b9a3
Uploaded
author | xuebing |
---|---|
date | Fri, 09 Mar 2012 19:37:19 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/new_operations/tables_arithmetic_operations.pl Fri Mar 09 19:37:19 2012 -0500 @@ -0,0 +1,117 @@ +# A program to implement arithmetic operations on tabular files data. The program takes three inputs: +# The first input is a TABULAR format file containing numbers only. +# The second input is a TABULAR format file containing numbers only. +# The two files must have the same number of columns and the same number of rows +# The third input is an arithmetic operation: +, -, *, or / for addition, subtraction, multiplication, or division, respectively +# The output file is a TABULAR format file containing the result of implementing the arithmetic operation on both input files. +# The output file has the same number of columns and the same number of rows as each of the two input files. +# Note: in case of division, none of the values in the second input file could be 0. + +use strict; +use warnings; + +#variables to handle information of the first input tabular file +my $lineData1 = ""; +my @lineDataArray1 = (); +my $lineArraySize = 0; +my $lineCounter1 = 0; + +#variables to handle information of the second input tabular file +my $lineData2= ""; +my @lineDataArray2 = (); +my $lineCounter2 = 0; + +my $result = 0; + +# check to make sure having the correct number of arguments +my $usage = "usage: tables_arithmetic_operations.pl [TABULAR.in] [TABULAR.in] [ArithmeticOperation] [TABULAR.out] \n"; +die $usage unless @ARGV == 4; + +#variables to store the names of input and output files +my $inputTabularFile1 = $ARGV[0]; +my $inputTabularFile2 = $ARGV[1]; +my $arithmeticOperation = $ARGV[2]; +my $outputTabularFile = $ARGV[3]; + +#open the input and output files +open (INPUT1, "<", $inputTabularFile1) || die("Could not open file $inputTabularFile1 \n"); +open (INPUT2, "<", $inputTabularFile2) || die("Could not open file $inputTabularFile2 \n"); +open (OUTPUT, ">", $outputTabularFile) || die("Could not open file $outputTabularFile \n"); + +#store the first input file in the array @motifsFrequencyData1 +my @tabularData1 = <INPUT1>; + +#store the second input file in the array @motifsFrequencyData2 +my @tabularData2 = <INPUT2>; + +#reset the $lineCounter1 to 0 +$lineCounter1 = 0; + +#iterated through the lines of the first input file +INDEL1: +foreach $lineData1 (@tabularData1){ + chomp ($lineData1); + $lineCounter1++; + + #reset the $lineCounter2 to 0 + $lineCounter2 = 0; + + #iterated through the lines of the second input file + foreach $lineData2 (@tabularData2){ + chomp ($lineData2); + $lineCounter2++; + + #check if the two motifs are the same in the two input files + if ($lineCounter1 == $lineCounter2){ + + @lineDataArray1 = split(/\t/, $lineData1); + @lineDataArray2 = split(/\t/, $lineData2); + + $lineArraySize = @lineDataArray1; + + for (my $index = 0; $index < $lineArraySize; $index++){ + + if ($arithmeticOperation eq "Addition"){ + #compute the additin of both values + $result = $lineDataArray1[$index] + $lineDataArray2[$index]; + } + + if ($arithmeticOperation eq "Subtraction"){ + #compute the subtraction of both values + $result = $lineDataArray1[$index] - $lineDataArray2[$index]; + } + + if ($arithmeticOperation eq "Multiplication"){ + #compute the multiplication of both values + $result = $lineDataArray1[$index] * $lineDataArray2[$index]; + } + + if ($arithmeticOperation eq "Division"){ + + #check if the denominator is 0 + if ($lineDataArray2[$index] != 0){ + #compute the division of both values + $result = $lineDataArray1[$index] / $lineDataArray2[$index]; + } + else{ + die("A denominator could not be zero \n"); + } + } + + #store the result in the output file + if ($index < $lineArraySize - 1){ + print OUTPUT $result . "\t"; + } + else{ + print OUTPUT $result . "\n"; + } + } + next INDEL1; + } + } +} + +#close the input and output files +close(OUTPUT); +close(INPUT2); +close(INPUT1); \ No newline at end of file