Friday, December 6, 2013

TEXT2SEGY Header

Kode Perl di bawah ini berfungsi untuk meng-injeksikan nilai header yang terdapat dalam file ASCII (.txt) ke dalam header SEGY. 

Berikut adalah feature dari Kode Perl tersebut:
  • Nilai header yang akan di-injeksikan dimulai dari kolom pertama sampai kolom ke-n.
  • User diberikan kebebasan untuk mendefinisikan banyaknya header yang akan di-injeksikan.
  • Urutan header harus sama dengan urutan trace i.e. baris pertama pada file ASCII untuk trace pertama, dst.
  • File ASCII harus integer e.g. jika anda memiliki nilai floating point dengan dua digit dibelakang koma anda harus mengkalikannya dengan 100. Gunakan AWK untuk komputasinya.

Gambar di bawah ini menunjukkan dump dari header sebelum injeksi text.


Gambar di bawah ini menunjukkan 5 baris pertama dari header.txt (pada contoh ini saya memiliki 4 kolom). Juga, perintah text2segyhdr.pl dengan meng-injeksikan kolom pertama dari text file untuk byte 1, kolom 2 untuk byte 9, kolom 3 untuk byte 17, dan kolom 4 untuk byte 25. Perhatikan bagaimana saya menjalankan perintah Perl!


Gambar di bawah  ini adalah dump setelah injeksi. Perhatikan byte 001, 009, 017, 025 sudah berubah.


Copy kode berikut lalu berinama text2segyhdr.pl, jalankan spt contoh saya di atas.
#!/usr/bin/perl
#SEGY READ
$fname=$ARGV[0];
my $num_args = $#ARGV -2;
print ">>>>> Read SEGY...<<<<< \n";
sysopen(IN,$fname,O_RDONLY) or die "Can't Open $fname: $!";
$size= -s IN;
sysread (IN,$binary,$size);
close(IN);
$noofsamples = unpack("n",substr($binary,3220,4));
$bytewidth=4;  #32 bits
$tracecount=($size-3600)/(240+$bytewidth*$noofsamples);
$tracecount = sprintf("%.0f", $tracecount);
print ">>>>> Read TEXT HEADER... <<<<< \n";

#####ASCII TEXT HEADER READ
my $file = $ARGV[1];
my @data;
open( FILE, $file ) or die "Can't open file '$file': $!";
while( <FILE> ) {
chomp;
my @row = split;
push @data, \@row;
}
close( FILE );

###INSERT TEXT TO HEADER
for ($j=0; $j<=$num_args; $j++)
{
for ($i=0; $i<=$tracecount; $i++)
        {$startbyte=3600+($i)*240+($i)*$bytewidth*$noofsamples+$ARGV[$j+2]-1;
         sysopen(IN,$fname,2) or die "Can't sysopen $fname";
         sysseek(IN,$startbyte,0);
         $databin = pack 'N', "$data[$i][$j]";
         syswrite(IN,$databin,4) or die "Can't write $fname";
         close(IN);
print "\e[?25l";
printf ">>>>> Writing Progress...be patient... (%.0f%%)\r",$i/$tracecount*100 ;
}
}
print "\e[?25h";
print "\n";
print ">>>>> Done ! <<<<< \n";

No comments: