/tools/new_operations/tables_arithmetic_operations.pl

https://bitbucket.org/cistrome/cistrome-harvard/ · Perl · 117 lines · 66 code · 24 blank · 27 comment · 14 complexity · c9eb3fdc97ad8aad33177099cb6f992a MD5 · raw file

  1. # A program to implement arithmetic operations on tabular files data. The program takes three inputs:
  2. # The first input is a TABULAR format file containing numbers only.
  3. # The second input is a TABULAR format file containing numbers only.
  4. # The two files must have the same number of columns and the same number of rows
  5. # The third input is an arithmetic operation: +, -, *, or / for addition, subtraction, multiplication, or division, respectively
  6. # The output file is a TABULAR format file containing the result of implementing the arithmetic operation on both input files.
  7. # The output file has the same number of columns and the same number of rows as each of the two input files.
  8. # Note: in case of division, none of the values in the second input file could be 0.
  9. use strict;
  10. use warnings;
  11. #variables to handle information of the first input tabular file
  12. my $lineData1 = "";
  13. my @lineDataArray1 = ();
  14. my $lineArraySize = 0;
  15. my $lineCounter1 = 0;
  16. #variables to handle information of the second input tabular file
  17. my $lineData2= "";
  18. my @lineDataArray2 = ();
  19. my $lineCounter2 = 0;
  20. my $result = 0;
  21. # check to make sure having the correct number of arguments
  22. my $usage = "usage: tables_arithmetic_operations.pl [TABULAR.in] [TABULAR.in] [ArithmeticOperation] [TABULAR.out] \n";
  23. die $usage unless @ARGV == 4;
  24. #variables to store the names of input and output files
  25. my $inputTabularFile1 = $ARGV[0];
  26. my $inputTabularFile2 = $ARGV[1];
  27. my $arithmeticOperation = $ARGV[2];
  28. my $outputTabularFile = $ARGV[3];
  29. #open the input and output files
  30. open (INPUT1, "<", $inputTabularFile1) || die("Could not open file $inputTabularFile1 \n");
  31. open (INPUT2, "<", $inputTabularFile2) || die("Could not open file $inputTabularFile2 \n");
  32. open (OUTPUT, ">", $outputTabularFile) || die("Could not open file $outputTabularFile \n");
  33. #store the first input file in the array @motifsFrequencyData1
  34. my @tabularData1 = <INPUT1>;
  35. #store the second input file in the array @motifsFrequencyData2
  36. my @tabularData2 = <INPUT2>;
  37. #reset the $lineCounter1 to 0
  38. $lineCounter1 = 0;
  39. #iterated through the lines of the first input file
  40. INDEL1:
  41. foreach $lineData1 (@tabularData1){
  42. chomp ($lineData1);
  43. $lineCounter1++;
  44. #reset the $lineCounter2 to 0
  45. $lineCounter2 = 0;
  46. #iterated through the lines of the second input file
  47. foreach $lineData2 (@tabularData2){
  48. chomp ($lineData2);
  49. $lineCounter2++;
  50. #check if the two motifs are the same in the two input files
  51. if ($lineCounter1 == $lineCounter2){
  52. @lineDataArray1 = split(/\t/, $lineData1);
  53. @lineDataArray2 = split(/\t/, $lineData2);
  54. $lineArraySize = @lineDataArray1;
  55. for (my $index = 0; $index < $lineArraySize; $index++){
  56. if ($arithmeticOperation eq "Addition"){
  57. #compute the additin of both values
  58. $result = $lineDataArray1[$index] + $lineDataArray2[$index];
  59. }
  60. if ($arithmeticOperation eq "Subtraction"){
  61. #compute the subtraction of both values
  62. $result = $lineDataArray1[$index] - $lineDataArray2[$index];
  63. }
  64. if ($arithmeticOperation eq "Multiplication"){
  65. #compute the multiplication of both values
  66. $result = $lineDataArray1[$index] * $lineDataArray2[$index];
  67. }
  68. if ($arithmeticOperation eq "Division"){
  69. #check if the denominator is 0
  70. if ($lineDataArray2[$index] != 0){
  71. #compute the division of both values
  72. $result = $lineDataArray1[$index] / $lineDataArray2[$index];
  73. }
  74. else{
  75. die("A denominator could not be zero \n");
  76. }
  77. }
  78. #store the result in the output file
  79. if ($index < $lineArraySize - 1){
  80. print OUTPUT $result . "\t";
  81. }
  82. else{
  83. print OUTPUT $result . "\n";
  84. }
  85. }
  86. next INDEL1;
  87. }
  88. }
  89. }
  90. #close the input and output files
  91. close(OUTPUT);
  92. close(INPUT2);
  93. close(INPUT1);