• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 202
  • Last Modified:

output problems again!

Hi all, I'm still having a problem with my output, if you can help? My current program is collecting numbers and doing a calculation which is all fine.  However, I have a problem with the spacing in the output file.I'm only dealing with the "NEWFILE" output here in my program.  My current output looks like this:

  1(E)( 95.58)A  2(E)( 24.87)Q  3(E)( 46.58)T  4(E)( 46.25)V..(etc)....10(E)( 23.33)L  11(E)(0.00)I  12(E)( 35.55)K  13(E)(  0.00)A  
14(E)( 35.76)D  15(E)( 44.55)K...(etc)......164(E)( 15.07)T  165(E)(  6.04)I  166(E)( 15.29)G  167(E)( 23.14)Y etc

This is fine but the problem is the spacing between the entries. I currently have 2 spaces between each entry eg 2(E)( 24.87)Q and
3(E)( 46.58)T.  However, because I have 1 digit before the, eg (E), 2 digits and 3 digits the spacing gets mixed up. I need an output format with the same distance between the start of one entry and the start of another. Eg like :1(E)( 95.58)A  2(E)( 24.87)Q if there is one digit before the(E), 10(E)( 23.33)L 11(E)(0.00)I if there are 2 digits before the (E) and like 165(E)(  6.04)I166(E)( 15.29)G if there are 3 digits before the (E).

I think its just a matter of changing the   "printf NEWFILE "$residual($A)(%6.2f)$AA  ", $calcval;" line...I hope you can help!
Thanks






program:

#!/usr/bin/perl
use strict;

my %vals = (A => 113,
            V => 160,
            L => 180,
            I => 182,
            P => 143,
            W => 259,
            F => 218,
            M => 204,
            G => 85,
            S => 122,
            T => 146,
            Y => 229,
            C => 140,
            N => 158,
            Q => 189,
            K => 211,
            R => 241,
            H => 194,
            D => 151,
            E => 183,
            X => "N");

my $offset    = 0;
my $linecnt   = 1;

my @ResVals   = ();
my @AAVals    = ();

open(INFILE, "/home/paul/tester3") or die "cannot open input file $!";
open(OUTFILE, '>b') or die "cannot open output file $!";
open(NEWFILE,'>a')  or die "cannot open output file $!";
while (my $line = <INFILE>) {
     next if ($line =~ /HYDROGEN/);

     my $residual = substr($line, 6,10);
     $residual =~ s/ //g;
     my $AA       = substr($line,13,1);
     $AA =~ s/ //g;
     my $ACC      = substr($line,35,4);
     $ACC =~ s/ //g;
     my $Reset    = substr($line,14,2);  
     my $A=substr($line, 9, 1);
     if ($Reset =~ /\*/) {
           print NEWFILE "\n";
           printf OUTFILE "Surface residues chainA:%s\n" ,  join(",", map{sprintf("%-3s", $_)} @ResVals);
           printf OUTFILE "Surface Resitype chainA:%s\n" ,  join(",", map{sprintf("%-3s", $_)} @AAVals);
           push(@FullResVals,@ResVals);          
           push(@FullAAVals,@AAVals);  

          @ResVals   = ();
          @AAVals    = ();
         
          $offset = $residual;
     }
     my $relres = $residual - $offset;
     
     my $calcval = -1;
     if (defined($vals{$AA})) {
          $calcval = ($ACC / $vals{$AA}) * 100;
     }
     printf NEWFILE "$residual($A)(%6.2f)$AA  ", $calcval;

     
     if ($calcval > 25) {  ## store the values only if the calculated value is greater than 50
          push @ResVals, $relres;
          push @AAVals, $AA;
     }
}
if ($#ResVals >= 0) {
     $pattern=join('|',@FullResVals);
     @ResVals=grep {!/$pattern/} @ResVals;
     printf OUTFILE "Surface residues chainB:%s\n" ,  join(",", map{sprintf("%-3s", $_)} @ResVals);
     printf OUTFILE "Surface resitype  chainB:%s\n" ,  join(",", map{sprintf("%-3s", $_)} @AAVals);
     $pattern=join('|',@FullAAVals);  
     
}

close(INFILE);
close(OUTFILE);
0
paulieomeara
Asked:
paulieomeara
  • 4
  • 2
1 Solution
 
paulieomearaAuthor Commented:
sorry, that should be an output like this:

1(E)( 95.58)A  2(E)( 24.87)Q if there is one digit before the(E),
10(E)( 23.33)L 11(E)(0.00)I if there are 2 digits before the (E) and like
165(E)(  6.04)166(E)( 15.29)G if there are 3 digits before the (E).
0
 
paulieomearaAuthor Commented:
apologies ....for the third: 165(E)(  6.04)I166(E)( 15.29)G if there are 3 digits before the (E).
0
 
paulieomearaAuthor Commented:
This is ridiculous I know....but what I need is always 4 spaces altogether between the last letter entry in the example and the start of the open bracket like this for example:
 1(E)( 95.58)A  2(E)( 24.87)Q 10(E)( 23.33)L 11(E)(0.00)I 165(E)(  6.04)F 166(E)( 15.29)G165 (E)(  6.04)
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
PerlKingCommented:
You want the first number to occupy 3 spaces irrespective of the number of digits it has.

Replace
printf NEWFILE "$residual($A)(%6.2f)$AA  ", $calcval;

with
printf NEWFILE "%3d($A)(%6.2f)$AA  ", $residual, $calcval;

This line should do that trick for you.
(You are telling printf to reserve 3 spaces for $residual irrespective of the number of digits in it)

Check the output with this and let me know if I misunderstood your requirement
0
 
PerlKingCommented:
Well, if you need 4 spaces and not 3 as was my previous understanding, you could use the following:

printf NEWFILE "%4d($A)(%6.2f)$AA  ", $residual, $calcval;
0
 
paulieomearaAuthor Commented:
That greats great..christ, if I'd spotted and solved this problem earlier I'd be a much happier man now!  Thank you!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now