Mercurial > repos > devteam > tables_arithmetic_operations
changeset 0:82fa5062d611 draft
Imported from capsule None
author | devteam |
---|---|
date | Tue, 01 Apr 2014 10:48:45 -0400 |
parents | |
children | 2e9f3b6ebfbc |
files | tables_arithmetic_operations.pl tables_arithmetic_operations.xml test-data/numericalTable1.tabular test-data/table_addition_result.tabular test-data/table_division_result.tabular test-data/table_multiplication_result.tabular test-data/table_subtraction_result.tabular |
diffstat | 7 files changed, 262 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tables_arithmetic_operations.pl Tue Apr 01 10:48:45 2014 -0400 @@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tables_arithmetic_operations.xml Tue Apr 01 10:48:45 2014 -0400 @@ -0,0 +1,105 @@ +<tool id="tables_arithmetic_operations" name="Arithmetic Operations " version="1.0.0"> + <description>on tables</description> + + <command interpreter="perl"> + tables_arithmetic_operations.pl $inputFile1 $inputFile2 $inputArithmeticOperation3 $outputFile1 + </command> + + <inputs> + <param format="tabular" name="inputFile1" type="data" label="Select the first input tabular file"/> + <param format="tabular" name="inputFile2" type="data" label="Select the second input tabular file"/> + + <param name="inputArithmeticOperation3" type="select" label="Choose the arithmetic operation:"> + <option value="Addition">Addition</option> + <option value="Subtraction">Subtraction</option> + <option value="Multiplication">Multiplication</option> + <option value="Division">Division</option> + </param> + </inputs> + + <outputs> + <data format="tabular" name="outputFile1"/> + </outputs> + + <tests> + <test> + <param name="inputFile1" value="numericalTable1.tabular" /> + <param name="inputFile2" value="numericalTable1.tabular" /> + <param name="inputArithmeticOperation3" value="Addition" /> + <output name="outputFile1" file="table_addition_result.tabular" /> + </test> + + <test> + <param name="inputFile1" value="numericalTable1.tabular" /> + <param name="inputFile2" value="numericalTable1.tabular" /> + <param name="inputArithmeticOperation3" value="Subtraction" /> + <output name="outputFile1" file="table_subtraction_result.tabular" /> + </test> + + <test> + <param name="inputFile1" value="numericalTable1.tabular" /> + <param name="inputFile2" value="numericalTable1.tabular" /> + <param name="inputArithmeticOperation3" value="Multiplication" /> + <output name="outputFile1" file="table_multiplication_result.tabular" /> + </test> + + <test> + <param name="inputFile1" value="numericalTable1.tabular" /> + <param name="inputFile2" value="numericalTable1.tabular" /> + <param name="inputArithmeticOperation3" value="Division" /> + <output name="outputFile1" file="table_division_result.tabular" /> + </test> + + </tests> + + + <help> + +.. class:: infomark + +**What it does** + +This program implements 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 third input is an arithmetic operation: +, -, x, 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. + + +Notes: + +- The two files must have the same number of columns and the same number of rows. +- The output file has the same number of columns and the same number of rows as each of the two input files. +- In case of division, none of the values in the second input file could be 0, otherwise the program will stop and report an error. + +**Example** + +Let us have the first input file as follows:: + + 5 4 0 + 10 11 12 + 1 3 1 + 1 2 1 + 2 0 4 + +And the second input file as follows:: + + 5 4 4 + 2 5 8 + 1 2 1 + 3 2 5 + 2 4 4 + +Running the program and choosing "Addition" as an arithmetic operation will give the following output:: + + 10 8 4 + 12 16 20 + 2 5 2 + 4 4 6 + 4 4 8 + + + </help> + +</tool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/numericalTable1.tabular Tue Apr 01 10:48:45 2014 -0400 @@ -0,0 +1,8 @@ +5 4 4 5 4 5 6 6 +10 11 12 14 15 14 19 23 +1 1 1 1 1 1 1 1 +1 2 1 2 2 1 4 3 +2 4 4 5 4 4 5 5 +3 1 2 1 1 2 3 3 +6 7 5 1 1 2 2 2 +4 4 4 5 8 7 6 6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/table_addition_result.tabular Tue Apr 01 10:48:45 2014 -0400 @@ -0,0 +1,8 @@ +10 8 8 10 8 10 12 12 +20 22 24 28 30 28 38 46 +2 2 2 2 2 2 2 2 +2 4 2 4 4 2 8 6 +4 8 8 10 8 8 10 10 +6 2 4 2 2 4 6 6 +12 14 10 2 2 4 4 4 +8 8 8 10 16 14 12 12
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/table_division_result.tabular Tue Apr 01 10:48:45 2014 -0400 @@ -0,0 +1,8 @@ +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/table_multiplication_result.tabular Tue Apr 01 10:48:45 2014 -0400 @@ -0,0 +1,8 @@ +25 16 16 25 16 25 36 36 +100 121 144 196 225 196 361 529 +1 1 1 1 1 1 1 1 +1 4 1 4 4 1 16 9 +4 16 16 25 16 16 25 25 +9 1 4 1 1 4 9 9 +36 49 25 1 1 4 4 4 +16 16 16 25 64 49 36 36