Friday, January 13, 2012

Advanced SU: Post-Stack Depth Migration

by Befriko Murdianto

Seismic Unix menyediakan beberapa fungsi untuk melakukan Post-Stack Depth Migration (PoSDM), antara lain sumigsplit yang menggunakan metode split-step Fourier migration (Stoffa et al, 1990) dan sumigpspi yang menggunakan metode phase-shift plus interpolation – PSPI (Gazdag and Sguazzero, 1984).

Untuk mendemonstrasikan PosDM pada SU, data sintetik SEG/EAGE salt model akan digunakan, data tersebut yang bisa diunduh di sini. Data ini berupa penampang stack dalam two-way-time yang sebelum migrasi. Velocity model dalam depth untuk data sintetik ini bisa diunduh di sini. Baik data sintetik maupun velocity model disimpan dalam format C-style binary format, yaitu SU format tanpa trace headers. Karena tidak ada informasi trace headers, maka berikut ini diberikan informasi yang diperlukan untuk menampilkan data tersebut:

Grid spacing velocity model arah lateral (dx): 40 ft
Grid spacing velocity model arah vertical (dz): 40 ft
Sample interval: 8 msec
Jumlah time sample data sintetik: 626
Jumlah depth sample velocity model: 300
Jumlah CDP data sintetik dan velocity model: 1290


Untuk menampilkan velocity model dari bentuk salt model ini bisa kita gunakan perintah ximage.

ximage <velocities.le.bin n1=300 d1=40 d2=40 label1="(ft)"="(ft)" title="SEG/EAGE Salt Model" legend=1 units="ft/sec" cmap=hsv6 &

Tampilan dari perintah di atas adalah sebagai berikut:


Agar data sintetik dapat ditampilkan dengan perintah SU, kita harus menambahkan trace header dulu supaya binary file tersebut menjadi SU format.

suaddhead ns=626 <data.le.bin | sushw key=dt a=8000 >data.le.su

Lalu dapat kita tampilkan data sintetik tersebut menggunakan perintah suximage.

suximage <data.le.su label1="Time (sec)" label2="CDP" title="Stack Section of SEG/EAGE Salt Model" legend=1 units="Amplitude" bclip=0.02 wclip=-0.02 &

Tampilannya adalah sebagai berikut:


Untuk melakukan PoSDM di SU, velocity file yang akan dipakai untuk PoSDM harus memiliki struktur vfile[iz][ix], yang berarti sumbu x merupakan “fast direction” (vertical) sedangkan sumbu z merupakan “slow direction” (lateral). Hal ini terbalik dengan velocity model yang kita miliki sekarang, yaitu sumbu z merupakan “fast direction” dan sumbu x merupakan “slow direction”. Untuk mengatasinya, kita dapat menggunakan perintah transp di SU untuk mentranspose matriks dari velocity model tersebut

transp <velocities.le.bin n1=300 >velocities.le.transp

Apabila kita tampilkan hasilnya menggunakan ximage

ximage <velocities.le.transp n1=1290 d1=40 d2=40 label1="Distance (ft)" label2="Depth (ft)" title="SEG/EAGE Salt Model (Transposed)" legend=1 units="ft/sec" cmap=hsv6 &

Tampilannya adalah seperti di bawah ini:


Sekarang kita sudah siap untuk melakukan PoSDM. Pertama-tama kita akan menggunakan metode split-step Fourier migration.

sumigsplit <data.le.su vfile=velocities.le.transp nz=300 dz=40 dx=40 >migsplit.su

Tampilkan hasilnya.

suximage <migsplit.su label1="Depth (ft)" label2="CDP" title="Split-step Fourier" legend=1 units="Amplitude" bclip=0.03 wclip=-0.03 &



Selanjutnya kita coba PoSDM menggunakan metode PSPI.

sumigpspi <data.le.su vfile=velocities.le.transp nz=300 dz=40 dx=40 >migpspi.su

Tamplikan hasilnya.

suximage <migpspi.su label1="Depth (ft)" label2="CDP" title="PSPI" legend=1 units="Amplitude" bclip=0.03 wclip=-0.03 &



Terlihat bahwa PSPI memberikan hasil yang sedikit lebih baik untuk subsalt imaging, meskipun steep dip imagingnya tidak sebaik split-step Fourier.

Berikut ini adalah perbandingannya dalam animated gif.

Photobucket

Referensi:
Stoffa, P. L., Fokkema, J. T., Freire, R. M. and Kessinger, W. P., 1990, Split-step Fourier migration, Geophysics, 55, 410-421.
Gazdag, J. and Sguazzero, P., 1984, Migration of seismic data by phase-shift plus interpolation, Geophysics, 49, 124-131.

Tuesday, January 10, 2012

Advanced SU: FX Decon

Walaupun secara teknis FX Decon tidak memberikan hasil sebaik Curvelet, tetapi pada kondisi tertentu FX Decon dapat dimanfaatkan untuk meredam noise yang bersifat random (random noise), linear noise bahkan sisa groundroll dan multiple yang berfrekuensi tinggi.

Secara teknis, masing-masing trace dalam domain T-X (waktu-offset) ditransform kedalam frekuensi domain, untuk masing-masing frekuensi, Winner Filter digunakan untuk memprediksi sampel berikutnya, lalu pada akhir proses data ditransformasi balik ke dalam domain T-X.

Pada script berikut saya menerapkan sufxdecon (FX Decon Seismic Unix) untuk sebuah CMP dari data marine setelah koreksi NMO.

Parameter penting yang berpengaruh terhadap hasil FX Decon adalah fmin, fmax, ntrf, ntrw dan taper. Anda silakan melakukan test dengan nilai parameter-parameter yang disesuaikan dengan kondisi data yang anda miliki dengan syarat jangan sampai menghilangkan reflektor dan difraksi.


#!/bin/sh

sunmo < cdp800.su tnmo=0,1,2,4 vnmo=1500,1600,2500,3000 | suwind tmin=3 tmax=4.5 > junk1.su
sunmo < cdp800.su tnmo=0,1,2,4 vnmo=1500,1600,2500,3000 | sufxdecon fmin=3 fmax=60 ntrf=77 ntrw=78 taper=0.01 | suwind tmin=3 tmax=4.5 > junk2.su

suximage < junk1.su perc=95 title='before' &
suximage < junk2.su perc=95 title='after' &
suop2 junk1.su junk2.su op=diff | suximage perc=95 title='diff' &

Sebelum FX Decon:

Setelah FX Decon:

Noise yang dihilangkan:


Perbandingannya:
Photobucket

Monday, January 9, 2012

Advanced SU: Median Filter

Seismic Unix menyediakan fungsi sumedian yang berguna untuk mengeliminasi event seismik dengan moveout (baca: kemiringan) tertentu.

Fungsi ini sangat berguna baik dalam pengolahan data seismic refleksi maupun Vertical Seismic Profiling (VSP).

Untuk mendemonstrasikan kegunaan sumedian pada data VSP silakan download data VSP di sini.

Link di atas direlease oleh Pemerintah Negara Bagian Victoria, dimana data tersebut hanya boleh digunakan untuk keperluan Studi dan Penelitian.

Selain data VSP terdapat juga link yang berisi data seismik (link1-link2), well-log, dll.

Untuk data VSP, saya akan menggunakan data VSI_007_A_gac_wavefield_z.sgy

Convert sgy ke su:

segyread tape=VSI_007_A_gac_wavefield_z.sgy verbose=1 endian=0 > VSI_007_A_gac_wavefield_z.su

Gunakan shell berikut untuk melakukan windowing, menampilkan dan median filter.

#!/bin/sh
suwind < VSI_007_A_gac_wavefield_z.su key=tracl
| suwind key=tracl min=20 max=120 tmin=0.1 tmax=0.6 | suximage perc=90 d1=0.002 title='ORIGINAL'&
suwind < VSI_007_A_gac_wavefield_z.su key=tracl
| sumedian tshift=1.25,0.6 xshift=1.11,149.436 median=1 | sumedian tshift=0.396025,0.972893 xshift=3.0093, 47.5488 median=1 | suwind key=tracl min=20 max=120 tmin=0.1 tmax=0.6 | suximage perc=90 d1=0.002 title='DOWNGOING WAVES'&

suwind < VSI_007_A_gac_wavefield_z.su key=tracl
| sumedian tshift=0.11,0.76 xshift=1.65,215.53 median=1 | sumedian tshift=0.396025,0.972893 xshift=3.0093, 47.5488 median=1 | suwind key=tracl min=20 max=120 tmin=0.1 tmax=0.6 | suximage perc=90 d1=0.002 title='UPGOING WAVES'&

Parameter penting sumedian adalah tshift (nilai sumbu Y) dan xshift (nilai sumbu X). tshift-xshift merupakan pasangan beberapa point untuk event-event dengan kemiringan tertentu. tshift dapat berupa waktu, depth, dll. dan xshift dapat berupa offset, tracl, dll.

Di bawah ini adalah rekaman VSP yang masih memiliki upgoing waves dan downgoing waves.
Downgoing waves:

Upgoing waves:
Perbandingannya:
Photobucket

Friday, January 6, 2012

Well-Log Data

Pembahasan mengenai beberapa konsep well logging telah dijelaskan pada artikel Gamma Ray, Resistivity, Neutron Porosity dan Density Logging.

Untuk keperluan studi dan penelitian, well log data dapat anda peroleh di sini, yang dipublikasikan oleh Department of the Interior U.S. Geological Survey untuk 14 Wildcat Wells di Alaska.

Ke-14 data well tersebut memiliki data log dengan format LAS yang anda dapat buka dengan text editor biasa seperti notepad, nedit atau gedit.

Berikut adalah contoh well-log untuk Tulageak-1 (klik untuk memperbesar):

Data well-log dengan format LAS dapat ditampilkan dengan software gratis dengan platform Windows seperti LASReader atau dengan software gratis lainnya seperti octave atau gnuplot.

Berikut adalah contoh cara menampilkan dan memanipulasi Tulageak-1 well log data dengan octave atau matlab.

Dengan Text editor bukalah TL1.LAS sehingga anda memperoleh penampilan seperti di bawah ini:

Baris 1 s/d 35 merupakan LAS header yang berisikan informasi mengenai data ini i.e. kolom pertama merupakan measured depth dengan satuan ft, kolom kedua merupakan data Spontaneous Potential (MV), dst.

Perhatikan pada tabel tersebut terdapat angka -999.00000, angka ini merupakan null value yang artinya tidak ada informasi pengukuran.

Pada terminal Linux, gunakan perintah sed untuk mengganti nilai -999.0000 dengan NaN (Not a Numeric).

sed -e 's/-999.00000/NaN/g' TL1.LAS > TL1_edit.LAS

Lalu gunakan kode berikut untuk membaca dan menampilkan. Download function hdrload.m terlebih dahulu.

clear; clc
[h, d] = hdrload('TL1_edit.LAS');
%plot gammaray
subplot(1,4,1);
plot(d(:,3),d(:,1),'r');
set (gca (), 'ydir', 'reverse','XGrid','on','YGrid','on');
axis([min(d(:,3)) max(d(:,3)) min(d(:,1)) max(d(:,1))]);
xlabel('GR(API)');
ylabel('Measured Depth(ft)');

%plot LLD
subplot(1,4,2);
semilogx(d(:,6),d(:,1),'m');
set (gca (),'ydir', 'reverse','XGrid','on','YGrid','on');
axis([min(d(:,6)) max(d(:,6)) min(d(:,1)) max(d(:,1))]);
xlabel('LLD(ohmM)');

%plot density
subplot(1,4,3);
plot(d(:,8),d(:,1),'b');
set (gca (), 'ydir', 'reverse','XGrid','on','YGrid','on');
axis([min(d(:,8)) max(d(:,8)) min(d(:,1)) max(d(:,1))]);
xlabel('Density(g/cc)');

%plot sonic
subplot(1,4,4);
plot(d(:,10),d(:,1),'g');
set (gca (), 'ydir', 'reverse','XGrid','on','YGrid','on');
axis([min(d(:,10)) max(d(:,10)) min(d(:,1)) max(d(:,1))]);
xlabel('Sonic(us/ft)');

Lalu kita akan melakukan smoothing atau despike dengan metoda Whittaker Method, dimana kodenya bisa didownload di sini.

Perhatikan manipulasi NaN values sebelum diterapkan whittf.

figure;
sonic=d(:,10);
depth=d(:,1);
loc=find(isnan(sonic) == 0);
sonic=sonic(loc);
depth=depth(loc);
plot(sonic,depth,'g',whittf(sonic,10^3),depth,'r',whittf(sonic,10^9),depth,'b');
legend('original','smooth-10^3','smooth-10^9')
set (gca (), 'ydir', 'reverse', 'xdir', 'reverse','XGrid','on','YGrid','on');
axis([min(sonic) max(sonic) min(depth) max(depth)]);
xlabel('Sonic(us/ft)');
ylabel('Measured Depth(ft)');
Di bawah ini saya melakukan despike untuk data sonic dan density, konversi data sonic menjadi kecepatan serta kedalaman dari feet ke meter dan lalu menyimpannya dalam format ascii.

%sonic
sonic=d(:,10);
depth=d(:,1);
loc_sonic=find(isnan(sonic) == 0);
sonic_edited=whittf((1000000./(3.28084.*sonic(loc_sonic))),10^4);
depth_sonic=depth(loc_sonic)./3.28084;
subplot(1,2,1)
plot(sonic_edited,depth_sonic);set (gca (), 'ydir', 'reverse','XGrid','on','YGrid','on');
xlabel('Velocity(m/s)');
ylabel('Measured Depth(m)');

%%%density
density=d(:,8);
depth=d(:,1);
loc_density=find(isnan(density) == 0);
density_edited=whittf(density(loc_density),10^4);
depth_density=depth(loc_density)./3.28084;
subplot(1,2,2)
plot(density_edited,depth_density);set (gca (), 'ydir', 'reverse','XGrid','on','YGrid','on');
xlabel('density(g/cc)');
ylabel('Measured Depth(m)');

dvfile=[depth_sonic,sonic_edited];
drfile=[depth_density,density_edited];

save dvfile.asc dvfile -ascii
save drfile.asc drfile -ascii

Konversi ascii ke binary, dan membuat seismogram sintetik dengan Seismic Unix.
a2b n1=2 < dvfile.asc > dvfile.bin
a2b n1=2 < drfile.asc > drfile.bin

suwellrf dvfile=dvfile.bin drfile=drfile.bin ntr=100 nval=7591 | suxwigb &

Tuesday, January 3, 2012

Check-Shot Survey

Check-Shot survey adalah survey pengukuran waktu tempuh gelombang seismik, dimana posisi sumber gelombang diletakkan di permukaan-dekat lubang bor sementara perekam berada di dalam lubang bor.

Gambar di bawah ini adalah ilustrasi geometri Check-Shot Survey.

Courtesy Halliburton

Sumber gelombang biasanya berupa air-gun (500 cu in). Jika survey-nya di darat, air gun disimpan di dalam sebuah bak air atau kolam. Air-gun digunakan karena lebih repeatable dibandingkan dinamit. Sedangkan alat perekam sendiri biasanya berupa geophone accelerator 3 komponen (X,Y,Z) dan berada pada 4 lokasi (4 shuttles) untuk satu rangkaian alat.

Perekaman dilakukan pada beberapa titik kedalaman lubang bor baik sebelum ataupun setelah dipasang casing. Interval kedalaman biasanya sekitar 100m atau sesuai dengan kebutuhan.

Gambar di bawah ini adalah ilustrasi gelombang langsung (direct wave) yang berupa minimum phase dengan first break (garis hitam miring) berupa waktu tempuh gelombang seismik .


Courtesy Halliburton

QC utama yang harus dilakukan pada rekaman Check-Shot adalah kejelasan first break yang bersih dari noise baik untuk komponen X,Y ataupun Z dan peningkatan waktu tempuh sejalan dengan penambahan kedalaman (jika posisi lubang bor vertikal atau miring). Hal ini akan berbeda jika pada horizontal well. Kualitas data dipengaruhi oleh kesehatan alat, coupling antara alat dan lubang bor, kehadiran gerowong yang berada dibalik casing, dll.

Produk utama dari Check-Shot adalah kurva hubungan waktu tempuh dengan kedalaman (TD Curve) yang sangat berguna untuk konversi waktu ke kedalaman, mengkoreksi sonic-sonic corrected check-shot *) untuk keperluan pembuatan seismogram sintetik, memperbaiki kecepatan seismic (velocity scaling), estimasi Q, dll.

Gambar di bawah ini menunjukkan kurva waktu tempuh dan kedalaman yang di-overlay dengan first break Check-Shot (kiri), sonic corrected checkshot (tengah), sintetik seismogram dan data seismik di sekitar lubang bor.

Courtesy Halliburton

*) Sonic corrected checkshot (data sonic dikoreksi oleh check shot): hal ini dilakukan karena diantaranya terjadi perbedaan orientasi ray path (jejak sinar). Jejak sinar seismik pada survey checkshot relatif tegak lurus terhadap perlapisan batuan sedangkan sonic cenderung sejajar. Perbedaan ini menghasilkan perbedaan waktu tempuh yang kita kenal dengan drift curve. Kalkulasi drift curve sudah saya jelaskan di sini.

Saturday, December 31, 2011

Seismic Refraction Ray Tracing

Metoda Seismik Refraksi merupakan metoda yang cukup populer digunakan baik untuk keperluan eksplorasi yang bersifat bisnis ataupun untuk keperluan riset.

Seperti yang saya jelaskan di sini, seismik refraksi digunakan untuk pendeteksian zona dekat permukaan (near surface zone) ataupun Refraction Tomo yang digunakan untuk koreksi statik yang mendukung keberhasilan pengolahan data seismik refleksi.

Seismik Refraksi kerap digunakan didalam global seismology untuk pendeteksian lapisan bumi dalam seperti zona subduksi, moho, mantel, dll.

Teknik dan kualitas Ray Tracing merupakan merupakan kunci keberhasilan pencitraan bawah permukaan. Terdapat berbagai macam metoda ray tracing, diantaranya Fast Marching Method, Finite Difference, Shooting Method, Bending Method, dll.

Untuk mempelajari Ray Tracing silakan anda download kode refract_raytracer.m serta data pendukungnya ak135.txt dan attenuationdata.txt.

Kode tersebut akan membaca lokasi sumber dan penerima serta kedalaman sumber dalam latitude dan longitude dengan model kecepatan ak135. Pada kode tersebut saya menggunakan Shooting Method yang melakukan iterasi beberapa kali sampai selisih error dibawah threshold tertentu.

Gambar di bawah ini merupakan penampang Jejak Sinar dalam 2D yang di-overlay dengan model kecepatan ak135.


Penampang Jejak Sinar dalam 3D (click untuk memperbesar)
Untuk mempelajari lebih jauh mengenai penerapan metoda ini, silakan download paper saya di sini.

Tuesday, December 27, 2011

Advanced SU: Seismic Attributes

Seismic Unix menyediakan fungsi suattributes yang berguna untuk menghitung Instantaneous Attributes seperti Amplitude Envelope, Instantaneous Phase, Instantaneous Frequency, Instantaneous Q Factor, dll.

Untuk mendemonstrasikan penggunaaan suattributes saya akan menggunakan porsi data marine yang telah saya bahas di sini. Proses yang telah saya terapkan terhadap data marine tersebut adalah radon demultiple, curvelet transform, PreStack Time Migration dan Outer Mute.

Berikut adalah contoh-contoh penerapan suattributes.

Data original
suximage < stackdata.su perc=95 wbox=1000 hbox=600 title='Original' cmap=rgb1 legend=1 &

Instantaneous Phase
suattributes < stackdata.su mode=phase | suximage perc=95 wbox=1000 hbox=600 title='Instantaneous Phase' cmap=hsv2 legend=1&

Instantaneous Frequency
suattributes < stackdata.su mode=freq | suximage perc=95 wbox=1000 hbox=600 title='Instantaneous Frequency' cmap=hsv1 legend=1&

Amplitude Envelope
suattributes < stackdata.su mode=amp | suximage perc=95 wbox=1000 hbox=600 title='Amplitude Envelope' cmap=rgb1 legend=1&

Wednesday, December 21, 2011

The 2004 BP Velocity-Analysis Benchmark

Model ini merupakan courtesy British Petroleum (BP) yang pada awalnya dibuat oleh Frederic Billette dan Sverre Brandsberg-Dahl pada tahun 2004.

Bagian kiri dari model 2D ini berdasarkan model geologi bagian barat Teluk Meksiko. Bagian tengahnya merupakan penyederhanaan dari model bagian Timur atau Tengah Teluk Meksiko dan lepas pantai Angola. Sedangkan bagian kanannya merepresentasikan model di Laut Caspia, North Sea atau Trinidad.

Model kecepatan dengan format SEGY dapat didownload di sini. Selain model kecepatan terdapat juga data seismik shot gathers serta data density.

Model kompleks ini sangat berguna bagi anda para mahasiswa Tugas Akhir atau Seismic Geek untuk bereksperimentasi Teknologi Seismik Lanjut.

Gambar di bawah ini merupakan hasil Reverse Time Migration, courtesy GX Technology.

Tuesday, December 20, 2011

Advanced SU: Mute Design

Pada bagian ini saya akan mendemonstrasikan bagaimana caranya melakukan desain dan mengimplementasikan mute dengan Seismic Unix.
Dalam contoh ini, mute desain berubah dari satu cdp ke cdp yang lainnya.

Pastikan anda memiliki data dalam domain cdp-offset yang menghindari stretch mute pada saat nmo yang mana dapat dilakukan dengan meningkatkan nilai smute pada parameter sunmo.

1. Lakukan pemecahan data su dengan perintah suplit dengan kunci cdp.

susplit < data_cdp_nmo.su > cdp_split key=cdp


2. Pindahkan data yang telah dipecah ke sebuah folder terpisah, lalu lakukan rename sehingga sequential:

#!/bin/sh
a=1
for i in *.su;
do
new=$(printf "%0d.su" ${a})
mv ${i} ${new}
let a=a+1
done

3. Ekstrak informasi header dari masing-masing cdp lalu meng-outputkannya ke sebuah file.

#! /bin/sh
datamin=300
datamax=500
k=$datamin
while [ $k -le $datamax ]
do
surange < $k.su > surange_$k
k=$((k+1))
done

4. Lakukan display mute dan pick

#!/bin/sh
datamin=300
datamax=350
interval=10
k=$datamin
while [ $k -le $datamax ]
do
offset=`sed -n "11p" surange_$k |awk '{print $2} '`
suximage < $k.su d1=0.002 f1=0 d2=100 f2=$offset perc=95 title=$k mpicks=mute$k.txt wbox=500 hbox=800 &
read response
k=$((k+$interval))
done

Pada kode di atas data minimum adalah 300 dan maksimum 350 dengan interval pick 10.

Pastikan display data seismik dalam sumbu y adalah TWT dalam (second) dan sumbu x dalam offset (meter)-lihat gambar di bawah Hal ini bisa dikontrol dengan d1=0.002 (sampling interval 2ms), f1=0 waktu pertama, d2=100 penambahan offset (m) dan f2 adalah offset trace pertama dari cdp yang bersangkutan yang diekstrak oleh perintah sed dan awk dengan input surange_$k. Proses mute biasanya dilakukan untuk keperluan stack, sehingga eliminasi noise seperti groundroll harus dilakukan terlebih dahulu. Pada gambar tersebut saya belum menerapkan groundroll removal.


Saya menyarankan untuk melakukan 3 buah picks pada masing-masing display (lihat contoh di atas) dengan mengarahkan kursor pada pasangan offset-waktu tertentu dengan menekan huruf 's' jika selesai tekan huruf 'q' lalu enter, maka display cdp berikutnya akan muncul. Lakukan hal serupa!

Jika proses tersebut selesai, maka data pick akan disimpan pada file mute$k.txt.

5. Untuk memperoleh desain mute pada seluruh CDP anda bisa melakukan interpolasi dari data yang anda pick atau anda bisa menggunakan nilai pick yang sama untuk cdp yang berdekatan. Misal pick pada cdp300 akan digunakan oleh data 300 s/d 305. Sedangkan pick 310 akan digunakan pada cdp 306 s/d 315, dan seterusnya. Hal ini bisa dilakukan dengan perintah berikut:


Buat list perintah copy:

#!/bin/sh
min=300
max=350
n=$min
while [ $n -le $max ]
do
echo cp mutenew$n.txt >>junk1
n=$((n+1))
done

Kumpulkan mute$k.txt menjadi sebuah file, gandakan 10 kali dan membuang 4 data pertama dan 5 data terakhir.
ls *.txt* | awk '{ for (i = 1; i <=10 ; i++) print }' | awk '(NR>4 && NR<56) {print $0} '> junk2


Lalu gabungkan:

paste junk1 junk2 | awk '{print $1,$3,$2}' > junk3

Copy-paste text yang terbentuk pada junk3 pada terminal.
more junk3
cp mute300.txt mutenew300.txt
cp mute300.txt mutenew301.txt
cp mute300.txt mutenew302.txt
cp mute300.txt mutenew303.txt
cp mute300.txt mutenew304.txt
cp mute300.txt mutenew305.txt
cp mute310.txt mutenew306.txt
cp mute310.txt mutenew307.txt
cp mute310.txt mutenew308.txt
cp mute310.txt mutenew309.txt
cp mute310.txt mutenew310.txt
cp mute310.txt mutenew311.txt
cp mute310.txt mutenew312.txt
cp mute310.txt mutenew313.txt
.
.
.

6. Untuk menghindari edge effect pada desain mute, gantilah nilai offset pertama dan terakhir dengan nilai offset min-max yang terbaca oleh surange:

#!/bin/sh
datamin=300
datamax=350
interval=1
k=$datamin
while [ $k -le $datamax ]
do
negoffset=`sed -n "11p" surange_$k | awk '{print $2} '`
posoffset=`sed -n "11p" surange_$k | awk '{print $3} '`
awk -v line=1 -v col=2 -v var=$negoffset '{ if(NR==line) { $col=var}; print $0}' mutenew$k.txt | awk -v line=3 -v col=2 -v var=$posoffset '{ if(NR==line) { $col=var}; print $0}' > muteok$k.txt
k=$((k+$interval))
done


7. Menerapkan mute untuk seluruh cdp dengan parameter mute masing-masing.

#!/bin/sh
datamin=300
datamax=350
interval=1
k=$datamin
while [ $k -le $datamax ]
do
mkparfile < muteok$k.txt > muteok$k.par string1=tmute string2=xmute
sumute mode=0 < $k.su par=muteok$k.par > cdp_after_mute$k.su
k=$((k+$interval))
done



cdp yang telah dimute


8. Untuk menggabungkan hasilnya lakukan perintah cat seperti yang telah dijelaskan disini.

Wednesday, December 14, 2011

e-book ensiklopediseismik

e-book ensiklopediseismik adalah kompilasi artikel yang telah saya publish di blog ini.

Format e-book tersebut adalah chm yang mana anda bisa membaca artikel-artikel secara offline dari sebuah file tunggal.

chm dapat dibuka secara otomatis pada platform windows, untuk ubuntu anda bisa menginstall xchm terlebih dahulu dengan perintah sudo apt-get install xchm

Untuk display yang lebih baik, saya sarankan untuk membukanya dengan platform Windows.

e-book tersebut (37.2MB) dapat di download di sini.

Berikut adalah screenshot e-book tersebut.

Thursday, December 8, 2011

Animated gif

Pada bagian ini saya akan membahas bagaimana caranya menghasilkan animated gif seperti contoh di bawah ini pada Ubuntu-Linux (click untuk memperbesar).

Photobucket
Waveform Modeling untuk Model Marmousi

Capture suximage dari Model Marmousi dengan screen-capture tool favorit anda seperti Take Screenshot (save marmousi.png), lalu lakukan waveform modeling seperti yang telah saya bahas di sini.

Jika suxmovie telah aktif, maka lakukan langkah-langkah sbb:

1. sudo apt-get install recordmydesktop gtk-recordmydesktop
2. Applications > Sound & Video > Desktop recorder (sebuah file ogv akan terbentuk setelah anda menekan stop-kotak merah di atas monitor)

3. Convert ogv ke avi
mencoder -idx out.ogv -ovc lavc -oac mp3lame -o out.avi

4. Lakukan pemilihan rentang waktu yang akan dipilih (contoh mulai 0:02 detik sampai 8 detik berikutnya)
mplayer -ao null -loop 0 -ss 0:02 -endpos +8 out.avi

5. Jika anda setuju dengan tahap 4 lakukan destilasi file jpg
mplayer -ao null -ss 0:02 -endpos +8 out.avi -vo jpeg:outdir=moviepics

6. Ubah format jpg ke gif
gedit junk1.sh
#!/bin/sh
echo "#!/bin/sh" >> junk2.sh
for file in *.jpg
do echo "convert $file $(basename $file .jpg).gif" >> junk2.sh
done

Jalankan dengan sh junk2.sh

7. rename data sehingga filename menjadi sequential

a=1
for i in *.gif; do
new=$(printf "%0d.gif" ${a})
mv ${i} ${new}
let a=a+1
done


8. Lakukan merging antara gambar yang telah didestilasi dengan model marmousi. (args=50 adalah derajat transparansi).

gedit junk3.sh
#! /bin/sh
datamin=1
datamax=61
n=$datamin
while [ $n -le $datamax ]
do
convert marmousi.png $n.gif -alpha on -compose blend -define compose:args=50 -gravity South -composite merge$n.gif
n=$((n+1))
done


Jalankan dengan sh junk3.sh

9. Buat perintah animasi

gedit junk4.sh
#!/bin/sh
echo "#!/bin/sh" >> junk5.sh
echo "gifsicle --delay=10 --loop=1000 --colors 256 \\" >> junk5.sh
min=1
max=61
n=$min
while [ $n -le $max ]
do
echo "merge$n.gif \\" >>junk5.sh
n=$((n+1))
done
echo "> anim.gif" >> junk5.sh


10. sudo apt-get install gifsicle

11. Jalankan sh junk5.sh

Monday, December 5, 2011

Curvelet Transform

Reduksi noise (denoising) merupakan salah satu pekerjaan penting didalam pengolahan data seismik. Dengan mereduksi noise diharapkan kita memperoleh hasil dengan S/N (Signal to Noise Ratio) yang tinggi. Pekerjaan ini cukup menantang terutama jika noise dan sinyal (dalam berbagai domain) tidak terpisahkan dengan baik.

Curvelet Transform merupakan teknologi yang diklaim mampu memisahkan coherent-random noise dari sinyal yang kita kehendaki, karena Transformasi Curvelet akan memisahkan noise dari sinyal dalam dimensi frekuensi, dip, azimuth dan lokasi. Karena kelebihannya ini Curvelet Transform dikenal dengan Transformasi multi dimensi yang tidak dimiliki oleh teknik konvensional seperti Median Filtering dan FX-Decon.

Curvelet Transform diadopsi oleh geoscientist dari Image Processing dan Scientific Computing, dimana pada kedua bidang tersebut telah lama diterapkan untuk berbagai keperluan diantaranya denoising.

Gambar di bawah ini merupakan contoh denoising image Monas dengan kadar noise tertentu. Anda dapat melakukan ekperimentasi ini dengan mendownload kode matlab atau scilab Curvelet Transform di sini dan di sini atau penerapannya pada data seismik yang bisa didownload di sini.

Aplikasi Curvelet pada Image Processing sebelum (kiri) dan setelah denoising (kanan)

Prinsip denoising dengan Curvelet Transform adalah sbb: melakukan FFT 2D pada data seismic (Stack atau CMP gather yang telah di NMO), melakukan window-ing dari hasil pertama dengan Polar Grid (gambar di bawah) dalam domain domain frekuensi dengan demikian diperoleh Curvelet Coefficient, melakukan scalling (denoising) dari koefisien curvelet tersebut, melakukan inversi untuk memperoleh kembali data seismik yang telah di-denoise.

Polar grid Curvelet dalam domain frekuensi (a) dan domain spatial (b) (Courtesy Douma and de Hoop)

Gambar di bawah ini adalah Curvelet dalam domain spatial (kolom pertama) dan amplitude spectra pada polar grid (kolom ketiga) untuk masing-masing Curvelet. Perhatikan bahwa curvelet untuk masing-masing lokasi polar grid memiliki ukuran(size), arah(azimuth), lokasi dan kemiringan tertentu.

Curvelet dan Amplitude Spectra pada Polar Grid (Courtesy Douma and de Hoop)

Gambar di bawah ini adalah aplikasi Curvelet Transform pada data seismik, cube AI yang diterapkan pada noisy data (kiri) dan AI yang diterapkan pada data setelah denoise dengan Curvelet Tranform (kanan).

Courtesy Neelami et. al.

Thursday, November 24, 2011

SEGY Header Dumper Version 1.1 and 2.1

Versi ini merupakan modifikasi kosmetik dari versi sebelumnya sehingga kita memperoleh tampilan seluruh informasi lokasi byte dalam satu screen.
Silakan download Version 1.1 dan Version 2.1

Berikut tampilannya:

Version 1.1


Version 2.1

Tuesday, November 22, 2011

SEGY Header Dumper Version 2

Versi ini memiliki kapabilitas untuk melakukan scanning seluruh trace header yang dimiliki oleh data SEGY, lalu menampilkan nilai minimum dan maksimum untuk setiap lokasi byte.

Berikut Contohnya:

./headerdumper_v2 gathertest.segy
------------------------------------------------
Sample interval :6000
No of samples per trace :2002
Number of Trace :13008
---------------------------------------------
--byte#: min-max----------------------------
1- 4: 1-13008
5- 8: 0-0
9- 12: 0-0
13- 16: 0-0
17- 20: 0-0
21- 24: 9010-9820
25- 28: 1-48
29- 32: 65536-65536
33- 36: 0-0
37- 40: 1050-24179
73- 76: 1261066-1593250
77- 80: 0-0
81- 84: 1261066-1593250
85- 88: 0-0
89- 92: 131072-131072
185-188: 0-0
189-192: 1175666186-1175998370
193-196: 0-0
197-200: 1175666186-1175998370
201-204: 0-0

Silakan download kode PERL di sini, lalu ikuti petunjuk yang telah saya jelaskan di sini.

SEGY Header Dumper Version 1

Pada artikel SEGY, saya telah membahas penggunaan Kode PERL untuk mengekstrak informasi yang dimiliki oleh binary header dan trace header yang pertama dari sebuah data SEGY.

Pada bagian ini anda dapat menggunakan kode PERL yang telah saya kembangkan untuk melakukan ekstrak trace header untuk setiap trace.

Berikut adalah contoh hasil dump sebuah file SEGY.
./segyheaddump1 gathertest.segy
This data is 32-bit IBM floating point
Sample interval :6000
No of samples per trace :2002
Number of Trace :13008
-----INSTRUCTION---------------
-----Press ENTER for the Next Trace--------
-----Press 9 then ENTER to EXIT------------
-----Trace Header Trace#:1 out of 13008
byte# 1- 4:1
byte# 5- 8:0
byte# 9- 12:0
byte# 13- 16:0
byte# 17- 20:0
byte# 21- 24:9010
byte# 25- 28:1
byte# 29- 32:65536
byte# 33- 36:0
byte# 37- 40:1050
byte# 41- 44:0
byte# 45- 48:0
byte# 49- 52:0
byte# 53- 56:0
byte# 57- 60:0
byte# 61- 64:0
byte# 65- 68:0
byte# 69- 72:0
byte# 73- 76:1261066
byte# 77- 80:0
byte# 81- 84:1261066
byte# 85- 88:0
byte# 89- 92:131072
byte# 93- 96:0
byte# 97-100:0
byte#101-104:0
byte#105-108:0
byte#109-112:0
byte#113-116:2002
byte#117-120:393216000
byte#181-184:0
byte#185-188:0
byte#189-192:1175666186
byte#193-196:0
byte#197-200:1175666186
byte#201-204:0


Download kode PERL di sini, lalu simpan dalam directory tempat data seismik anda berada.

Coba jalankan dengan perintah:
perl headerdumper_v1.pl file.segy

Anda dapat meng-compile kode perl dengan perintah pp. Jika anda belum memilikinya install (UBUNTU 10.10) dengan perintah:
sudo apt-get install libpar-packer-perl

Setelah itu compile dengan perintah:
pp -o segyheaderdumper headerdumper_v1.pl

Lalu run:
./segyheaderdumper file.sgy

Saturday, November 19, 2011

SEGY

SEGY merupakan format data seismik yang sangat populer digunakan didalam industri migas.

Sebuah file SEGY terdiri atas susunan sebagai berikut:
Blok #1: EBCDID Header dengan ukuran 3200 byte
Blok #2: Binary header dengan ukuran 400 byte
Blok #3: Trace identification header trace pertama dengan ukuran 240 byte
Blok #4: Data trace pertama (ukuran bervariasi)
Blok #3: Trace identification header trace kedua dengan ukuran 240 byte
Blok #4: Data trace kedua (ukuran bervariasi)
Dst...

Berikut adalah skema file SEGY:

Courtesy www.geo.uib.no

Blok #1 berisikan berbagai informasi seperti Nama Perusahaan, Tahun Pengambilan, Jenis Instrumen, Sampling Rate, No Trace, dll.
Blok #2 berisikan informasi seperti line id, sample int, no sample, Fold, format data, dll.
Blok #3 berisikan informasi seperti Line No, CDP, Koordinat Sumber/Penerima, dll.
Blok #4 berisikan data seismik itu sendiri.

Untuk lebih jelasnya silakan buka link berikut.

Software-software komersial menyediakan fasilitas yang dapat menampilkan semua informasi di atas.

Pada UNIX anda dapat mengekstrak informasi tersebut dengan perintah dd dan sebuah kode program.


Untuk menampilkan EBCDIC header anda dapat menggunakan perintas sbb:

dd if=data.segy conv=ascii ibs=3200 count=1


Atau

dd if=data.segy conv=ascii ibs=3200 count=1 | awk 'BEGIN{RS="C[0-9 ][0-9]"}{printf "C%2d%s\n",NR,$0}'

Berikut adalah contoh EBCDIC header dari perintah di atas (berisikan 40 baris dan 80 kolom i.e. 40*80=3200):


Untuk menampilkan Binary header dan Trace Header yang pertama, anda dapat menggunakan kode PERL di bawah ini.

Bukalah gedit lalu copy kode tersebut lalu berinama headerdumper.pl
Simpan file headerdumper.pl pada directory yang sama dengan data seismik anda, lalu pada terminal Linux ketik perintah:

perl headerdumper.pl gathertest.segy

Sehingga diperoleh hasil berikut:



#!/usr/bin/perl

die "perl headerdumper.pl file.sgy\n " if $#ARGV !=0;
$fname=$ARGV [0 ];
sysopen(IN,$fname,O_RDONLY) or die "Can't Open $fname: $! ";
sysread (IN,$binHeader,3840);
$size= -s IN;
$Samplingrate= unpack( "n ",substr($binHeader,3216,2));
$Noofsamples = unpack( "n ",substr($binHeader,3220,2));
$formatcode= unpack( "n ",substr($binHeader,3224,2));

if($formatcode==1)
{
$bytewidth=4;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
} elsif($formatcode==2)
{
$bytewidth=4;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
} elsif($formatcode==3)
{
$bytewidth=2;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
} elsif($formatcode==4)
{
$bytewidth=4;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
} elsif($formatcode==5)
{
$bytewidth=4;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
} elsif($formatcode==6)
{
$bytewidth=4;
$tracecount=($size-3600)/(240+$bytewidth*$Noofsamples);
}
else {print " I dont know this type of format code\n "; }


$head_16bit_001 = unpack( "n ",substr($binHeader,3600,2));
$head_16bit_002 = unpack( "n ",substr($binHeader,3602,2));
$head_16bit_003 = unpack( "n ",substr($binHeader,3604,2));
$head_16bit_004 = unpack( "n ",substr($binHeader,3606,2));
$head_16bit_005 = unpack( "n ",substr($binHeader,3608,2));
$head_16bit_006 = unpack( "n ",substr($binHeader,3610,2));
$head_16bit_007 = unpack( "n ",substr($binHeader,3612,2));
$head_16bit_008 = unpack( "n ",substr($binHeader,3614,2));
$head_16bit_009 = unpack( "n ",substr($binHeader,3616,2));
$head_16bit_010 = unpack( "n ",substr($binHeader,3618,2));
$head_16bit_011 = unpack( "n ",substr($binHeader,3620,2));
$head_16bit_012 = unpack( "n ",substr($binHeader,3622,2));
$head_16bit_013 = unpack( "n ",substr($binHeader,3624,2));
$head_16bit_014 = unpack( "n ",substr($binHeader,3626,2));
$head_16bit_015 = unpack( "n ",substr($binHeader,3628,2));
$head_16bit_016 = unpack( "n ",substr($binHeader,3630,2));
$head_16bit_017 = unpack( "n ",substr($binHeader,3632,2));
$head_16bit_018 = unpack( "n ",substr($binHeader,3634,2));
$head_16bit_019 = unpack( "n ",substr($binHeader,3636,2));
$head_16bit_020 = unpack( "n ",substr($binHeader,3638,2));
$head_16bit_021 = unpack( "n ",substr($binHeader,3640,2));
$head_16bit_022 = unpack( "n ",substr($binHeader,3642,2));
$head_16bit_023 = unpack( "n ",substr($binHeader,3644,2));
$head_16bit_024 = unpack( "n ",substr($binHeader,3646,2));
$head_16bit_025 = unpack( "n ",substr($binHeader,3648,2));
$head_16bit_026 = unpack( "n ",substr($binHeader,3650,2));
$head_16bit_027 = unpack( "n ",substr($binHeader,3652,2));
$head_16bit_028 = unpack( "n ",substr($binHeader,3654,2));
$head_16bit_029 = unpack( "n ",substr($binHeader,3656,2));
$head_16bit_030 = unpack( "n ",substr($binHeader,3658,2));
$head_16bit_031 = unpack( "n ",substr($binHeader,3660,2));
$head_16bit_032 = unpack( "n ",substr($binHeader,3662,2));
$head_16bit_033 = unpack( "n ",substr($binHeader,3664,2));
$head_16bit_034 = unpack( "n ",substr($binHeader,3666,2));
$head_16bit_035 = unpack( "n ",substr($binHeader,3668,2));
$head_16bit_036 = unpack( "n ",substr($binHeader,3670,2));
$head_16bit_037 = unpack( "n ",substr($binHeader,3672,2));
$head_16bit_038 = unpack( "n ",substr($binHeader,3674,2));
$head_16bit_039 = unpack( "n ",substr($binHeader,3676,2));
$head_16bit_040 = unpack( "n ",substr($binHeader,3678,2));
$head_16bit_041 = unpack( "n ",substr($binHeader,3680,2));
$head_16bit_042 = unpack( "n ",substr($binHeader,3682,2));
$head_16bit_043 = unpack( "n ",substr($binHeader,3684,2));
$head_16bit_044 = unpack( "n ",substr($binHeader,3686,2));
$head_16bit_045 = unpack( "n ",substr($binHeader,3688,2));
$head_16bit_046 = unpack( "n ",substr($binHeader,3690,2));
$head_16bit_047 = unpack( "n ",substr($binHeader,3692,2));
$head_16bit_048 = unpack( "n ",substr($binHeader,3694,2));
$head_16bit_049 = unpack( "n ",substr($binHeader,3696,2));
$head_16bit_050 = unpack( "n ",substr($binHeader,3698,2));
$head_16bit_051 = unpack( "n ",substr($binHeader,3700,2));
$head_16bit_052 = unpack( "n ",substr($binHeader,3702,2));
$head_16bit_053 = unpack( "n ",substr($binHeader,3704,2));
$head_16bit_054 = unpack( "n ",substr($binHeader,3706,2));
$head_16bit_055 = unpack( "n ",substr($binHeader,3708,2));
$head_16bit_056 = unpack( "n ",substr($binHeader,3710,2));
$head_16bit_057 = unpack( "n ",substr($binHeader,3712,2));
$head_16bit_058 = unpack( "n ",substr($binHeader,3714,2));
$head_16bit_059 = unpack( "n ",substr($binHeader,3716,2));
$head_16bit_060 = unpack( "n ",substr($binHeader,3718,2));
$head_16bit_061 = unpack( "n ",substr($binHeader,3720,2));
$head_16bit_062 = unpack( "n ",substr($binHeader,3722,2));
$head_16bit_063 = unpack( "n ",substr($binHeader,3724,2));
$head_16bit_064 = unpack( "n ",substr($binHeader,3726,2));
$head_16bit_065 = unpack( "n ",substr($binHeader,3728,2));
$head_16bit_066 = unpack( "n ",substr($binHeader,3730,2));
$head_16bit_067 = unpack( "n ",substr($binHeader,3732,2));
$head_16bit_068 = unpack( "n ",substr($binHeader,3734,2));
$head_16bit_069 = unpack( "n ",substr($binHeader,3736,2));
$head_16bit_070 = unpack( "n ",substr($binHeader,3738,2));
$head_16bit_071 = unpack( "n ",substr($binHeader,3740,2));
$head_16bit_072 = unpack( "n ",substr($binHeader,3742,2));
$head_16bit_073 = unpack( "n ",substr($binHeader,3744,2));
$head_16bit_074 = unpack( "n ",substr($binHeader,3746,2));
$head_16bit_075 = unpack( "n ",substr($binHeader,3748,2));
$head_16bit_076 = unpack( "n ",substr($binHeader,3750,2));
$head_16bit_077 = unpack( "n ",substr($binHeader,3752,2));
$head_16bit_078 = unpack( "n ",substr($binHeader,3754,2));
$head_16bit_079 = unpack( "n ",substr($binHeader,3756,2));
$head_16bit_080 = unpack( "n ",substr($binHeader,3758,2));
$head_16bit_081 = unpack( "n ",substr($binHeader,3760,2));
$head_16bit_082 = unpack( "n ",substr($binHeader,3762,2));
$head_16bit_083 = unpack( "n ",substr($binHeader,3764,2));
$head_16bit_084 = unpack( "n ",substr($binHeader,3766,2));
$head_16bit_085 = unpack( "n ",substr($binHeader,3768,2));
$head_16bit_086 = unpack( "n ",substr($binHeader,3770,2));
$head_16bit_087 = unpack( "n ",substr($binHeader,3772,2));
$head_16bit_088 = unpack( "n ",substr($binHeader,3774,2));
$head_16bit_089 = unpack( "n ",substr($binHeader,3776,2));
$head_16bit_090 = unpack( "n ",substr($binHeader,3778,2));
$head_16bit_091 = unpack( "n ",substr($binHeader,3780,2));
$head_16bit_092 = unpack( "n ",substr($binHeader,3782,2));
$head_16bit_093 = unpack( "n ",substr($binHeader,3784,2));
$head_16bit_094 = unpack( "n ",substr($binHeader,3786,2));
$head_16bit_095 = unpack( "n ",substr($binHeader,3788,2));
$head_16bit_096 = unpack( "n ",substr($binHeader,3790,2));
$head_16bit_097 = unpack( "n ",substr($binHeader,3792,2));
$head_16bit_098 = unpack( "n ",substr($binHeader,3794,2));
$head_16bit_099 = unpack( "n ",substr($binHeader,3796,2));
$head_16bit_100 = unpack( "n ",substr($binHeader,3798,2));
$head_16bit_101 = unpack( "n ",substr($binHeader,3800,2));
$head_16bit_102 = unpack( "n ",substr($binHeader,3802,2));
$head_16bit_103 = unpack( "n ",substr($binHeader,3804,2));
$head_16bit_104 = unpack( "n ",substr($binHeader,3806,2));
$head_16bit_105 = unpack( "n ",substr($binHeader,3808,2));
$head_16bit_106 = unpack( "n ",substr($binHeader,3810,2));
$head_16bit_107 = unpack( "n ",substr($binHeader,3812,2));
$head_16bit_108 = unpack( "n ",substr($binHeader,3814,2));
$head_16bit_109 = unpack( "n ",substr($binHeader,3816,2));
$head_16bit_110 = unpack( "n ",substr($binHeader,3818,2));
$head_16bit_111 = unpack( "n ",substr($binHeader,3820,2));
$head_16bit_112 = unpack( "n ",substr($binHeader,3822,2));
$head_16bit_113 = unpack( "n ",substr($binHeader,3824,2));
$head_16bit_114 = unpack( "n ",substr($binHeader,3826,2));
$head_16bit_115 = unpack( "n ",substr($binHeader,3828,2));
$head_16bit_116 = unpack( "n ",substr($binHeader,3830,2));
$head_16bit_117 = unpack( "n ",substr($binHeader,3832,2));
$head_16bit_118 = unpack( "n ",substr($binHeader,3834,2));
$head_16bit_119 = unpack( "n ",substr($binHeader,3836,2));
$head_16bit_120 = unpack( "n ",substr($binHeader,3838,2));

$head_32bit_001 = unpack( "N ",substr($binHeader,3600,4));
$head_32bit_003 = unpack( "N ",substr($binHeader,3604,4));
$head_32bit_005 = unpack( "N ",substr($binHeader,3608,4));
$head_32bit_007 = unpack( "N ",substr($binHeader,3612,4));
$head_32bit_009 = unpack( "N ",substr($binHeader,3616,4));
$head_32bit_011 = unpack( "N ",substr($binHeader,3620,4));
$head_32bit_013 = unpack( "N ",substr($binHeader,3624,4));
$head_32bit_015 = unpack( "N ",substr($binHeader,3628,4));
$head_32bit_017 = unpack( "N ",substr($binHeader,3632,4));
$head_32bit_019 = unpack( "N ",substr($binHeader,3636,4));
$head_32bit_021 = unpack( "N ",substr($binHeader,3640,4));
$head_32bit_023 = unpack( "N ",substr($binHeader,3644,4));
$head_32bit_025 = unpack( "N ",substr($binHeader,3648,4));
$head_32bit_027 = unpack( "N ",substr($binHeader,3652,4));
$head_32bit_029 = unpack( "N ",substr($binHeader,3656,4));
$head_32bit_031 = unpack( "N ",substr($binHeader,3660,4));
$head_32bit_033 = unpack( "N ",substr($binHeader,3664,4));
$head_32bit_035 = unpack( "N ",substr($binHeader,3668,4));
$head_32bit_037 = unpack( "N ",substr($binHeader,3672,4));
$head_32bit_039 = unpack( "N ",substr($binHeader,3676,4));
$head_32bit_041 = unpack( "N ",substr($binHeader,3680,4));
$head_32bit_043 = unpack( "N ",substr($binHeader,3684,4));
$head_32bit_045 = unpack( "N ",substr($binHeader,3688,4));
$head_32bit_047 = unpack( "N ",substr($binHeader,3692,4));
$head_32bit_049 = unpack( "N ",substr($binHeader,3696,4));
$head_32bit_051 = unpack( "N ",substr($binHeader,3700,4));
$head_32bit_053 = unpack( "N ",substr($binHeader,3704,4));
$head_32bit_055 = unpack( "N ",substr($binHeader,3708,4));
$head_32bit_057 = unpack( "N ",substr($binHeader,3712,4));
$head_32bit_059 = unpack( "N ",substr($binHeader,3716,4));
$head_32bit_061 = unpack( "N ",substr($binHeader,3720,4));
$head_32bit_063 = unpack( "N ",substr($binHeader,3724,4));
$head_32bit_065 = unpack( "N ",substr($binHeader,3728,4));
$head_32bit_067 = unpack( "N ",substr($binHeader,3732,4));
$head_32bit_069 = unpack( "N ",substr($binHeader,3736,4));
$head_32bit_071 = unpack( "N ",substr($binHeader,3740,4));
$head_32bit_073 = unpack( "N ",substr($binHeader,3744,4));
$head_32bit_075 = unpack( "N ",substr($binHeader,3748,4));
$head_32bit_077 = unpack( "N ",substr($binHeader,3752,4));
$head_32bit_079 = unpack( "N ",substr($binHeader,3756,4));
$head_32bit_081 = unpack( "N ",substr($binHeader,3760,4));
$head_32bit_083 = unpack( "N ",substr($binHeader,3764,4));
$head_32bit_085 = unpack( "N ",substr($binHeader,3768,4));
$head_32bit_087 = unpack( "N ",substr($binHeader,3772,4));
$head_32bit_089 = unpack( "N ",substr($binHeader,3776,4));
$head_32bit_091 = unpack( "N ",substr($binHeader,3780,4));
$head_32bit_093 = unpack( "N ",substr($binHeader,3784,4));
$head_32bit_095 = unpack( "N ",substr($binHeader,3788,4));
$head_32bit_097 = unpack( "N ",substr($binHeader,3792,4));
$head_32bit_099 = unpack( "N ",substr($binHeader,3796,4));
$head_32bit_101 = unpack( "N ",substr($binHeader,3800,4));
$head_32bit_103 = unpack( "N ",substr($binHeader,3804,4));
$head_32bit_105 = unpack( "N ",substr($binHeader,3808,4));
$head_32bit_107 = unpack( "N ",substr($binHeader,3812,4));
$head_32bit_109 = unpack( "N ",substr($binHeader,3816,4));
$head_32bit_111 = unpack( "N ",substr($binHeader,3820,4));
$head_32bit_113 = unpack( "N ",substr($binHeader,3824,4));
$head_32bit_115 = unpack( "N ",substr($binHeader,3828,4));
$head_32bit_117 = unpack( "N ",substr($binHeader,3832,4));
$head_32bit_119 = unpack( "N ",substr($binHeader,3836,4));

print "--Segy Header Dumper by Agus Abdullah, PhD----\n ";
print "-----modified from Peter Zahuczki-------------\n ";
print "--------------reel header---------------------\n ";
print "Sampling Rate : ",$Samplingrate, "\n ";
print "No of Samples per Trace : ",$Noofsamples, "\n ";
print "No of Trace : ",$tracecount, "\n ";
print "Format Code : ",$formatcode, "\n ";
print "Size : ",$size, "\n ";
print "--------------First Trace Header 16 BIT-------\n ";
print " byte#1-2: ",$head_16bit_001, "\n ";
print " byte#3-4: ",$head_16bit_002, "\n ";
print " byte#5-6: ",$head_16bit_003, "\n ";
print " byte#7-8: ",$head_16bit_004, "\n ";
print " byte#9-10: ",$head_16bit_005, "\n ";
print " byte#11-12: ",$head_16bit_006, "\n ";
print " byte#13-14: ",$head_16bit_007, "\n ";
print " byte#15-16: ",$head_16bit_008, "\n ";
print " byte#17-18: ",$head_16bit_009, "\n ";
print " byte#19-20: ",$head_16bit_010, "\n ";
print " byte#21-22: ",$head_16bit_011, "\n ";
print " byte#23-24: ",$head_16bit_012, "\n ";
print " byte#25-26: ",$head_16bit_013, "\n ";
print " byte#27-28: ",$head_16bit_014, "\n ";
print " byte#29-30: ",$head_16bit_015, "\n ";
print " byte#31-32: ",$head_16bit_016, "\n ";
print " byte#33-34: ",$head_16bit_017, "\n ";
print " byte#35-36: ",$head_16bit_018, "\n ";
print " byte#37-38: ",$head_16bit_019, "\n ";
print " byte#39-40: ",$head_16bit_020, "\n ";
print " byte#41-42: ",$head_16bit_021, "\n ";
print " byte#43-44: ",$head_16bit_022, "\n ";
print " byte#45-46: ",$head_16bit_023, "\n ";
print " byte#47-48: ",$head_16bit_024, "\n ";
print " byte#49-50: ",$head_16bit_025, "\n ";
print " byte#51-52: ",$head_16bit_026, "\n ";
print " byte#53-54: ",$head_16bit_027, "\n ";
print " byte#55-56: ",$head_16bit_028, "\n ";
print " byte#57-58: ",$head_16bit_029, "\n ";
print " byte#59-60: ",$head_16bit_030, "\n ";
print " byte#61-62: ",$head_16bit_031, "\n ";
print " byte#63-64: ",$head_16bit_032, "\n ";
print " byte#65-66: ",$head_16bit_033, "\n ";
print " byte#67-68: ",$head_16bit_034, "\n ";
print " byte#69-70: ",$head_16bit_035, "\n ";
print " byte#71-72: ",$head_16bit_036, "\n ";
print " byte#73-74: ",$head_16bit_037, "\n ";
print " byte#75-76: ",$head_16bit_038, "\n ";
print " byte#77-78: ",$head_16bit_039, "\n ";
print " byte#79-80: ",$head_16bit_040, "\n ";
print " byte#81-82: ",$head_16bit_041, "\n ";
print " byte#83-84: ",$head_16bit_042, "\n ";
print " byte#85-86: ",$head_16bit_043, "\n ";
print " byte#87-88: ",$head_16bit_044, "\n ";
print " byte#89-90: ",$head_16bit_045, "\n ";
print " byte#91-92: ",$head_16bit_046, "\n ";
print " byte#93-94: ",$head_16bit_047, "\n ";
print " byte#95-96: ",$head_16bit_048, "\n ";
print " byte#97-98: ",$head_16bit_049, "\n ";
print " byte#99-100: ",$head_16bit_050, "\n ";
print " byte#101-102: ",$head_16bit_051, "\n ";
print " byte#103-104: ",$head_16bit_052, "\n ";
print " byte#105-106: ",$head_16bit_053, "\n ";
print " byte#107-108: ",$head_16bit_054, "\n ";
print " byte#109-110: ",$head_16bit_055, "\n ";
print " byte#111-112: ",$head_16bit_056, "\n ";
print " byte#113-114: ",$head_16bit_057, "\n ";
print " byte#115-116: ",$head_16bit_058, "\n ";
print " byte#117-118: ",$head_16bit_059, "\n ";
print " byte#119-120: ",$head_16bit_060, "\n ";
print " byte#121-122: ",$head_16bit_061, "\n ";
print " byte#123-124: ",$head_16bit_062, "\n ";
print " byte#125-126: ",$head_16bit_063, "\n ";
print " byte#127-128: ",$head_16bit_064, "\n ";
print " byte#129-130: ",$head_16bit_065, "\n ";
print " byte#131-132: ",$head_16bit_066, "\n ";
print " byte#133-134: ",$head_16bit_067, "\n ";
print " byte#135-136: ",$head_16bit_068, "\n ";
print " byte#137-138: ",$head_16bit_069, "\n ";
print " byte#139-140: ",$head_16bit_070, "\n ";
print " byte#141-142: ",$head_16bit_071, "\n ";
print " byte#143-144: ",$head_16bit_072, "\n ";
print " byte#145-146: ",$head_16bit_073, "\n ";
print " byte#147-148: ",$head_16bit_074, "\n ";
print " byte#149-150: ",$head_16bit_075, "\n ";
print " byte#151-152: ",$head_16bit_076, "\n ";
print " byte#153-154: ",$head_16bit_077, "\n ";
print " byte#155-156: ",$head_16bit_078, "\n ";
print " byte#157-158: ",$head_16bit_079, "\n ";
print " byte#159-160: ",$head_16bit_080, "\n ";
print " byte#161-162: ",$head_16bit_081, "\n ";
print " byte#163-164: ",$head_16bit_082, "\n ";
print " byte#165-166: ",$head_16bit_083, "\n ";
print " byte#167-168: ",$head_16bit_084, "\n ";
print " byte#169-170: ",$head_16bit_085, "\n ";
print " byte#171-172: ",$head_16bit_086, "\n ";
print " byte#173-174: ",$head_16bit_087, "\n ";
print " byte#175-176: ",$head_16bit_088, "\n ";
print " byte#177-178: ",$head_16bit_089, "\n ";
print " byte#179-180: ",$head_16bit_090, "\n ";
print " byte#181-182: ",$head_16bit_091, "\n ";
print " byte#183-184: ",$head_16bit_092, "\n ";
print " byte#185-186: ",$head_16bit_093, "\n ";
print " byte#187-188: ",$head_16bit_094, "\n ";
print " byte#189-190: ",$head_16bit_095, "\n ";
print " byte#191-192: ",$head_16bit_096, "\n ";
print " byte#193-194: ",$head_16bit_097, "\n ";
print " byte#195-196: ",$head_16bit_098, "\n ";
print " byte#197-198: ",$head_16bit_099, "\n ";
print " byte#199-200: ",$head_16bit_100, "\n ";
print " byte#201-202: ",$head_16bit_101, "\n ";
print " byte#203-204: ",$head_16bit_102, "\n ";
print " byte#205-206: ",$head_16bit_103, "\n ";
print " byte#207-208: ",$head_16bit_104, "\n ";
print " byte#209-210: ",$head_16bit_105, "\n ";
print " byte#211-212: ",$head_16bit_106, "\n ";
print " byte#213-214: ",$head_16bit_107, "\n ";
print " byte#215-216: ",$head_16bit_108, "\n ";
print " byte#217-218: ",$head_16bit_109, "\n ";
print " byte#219-220: ",$head_16bit_110, "\n ";
print " byte#221-222: ",$head_16bit_111, "\n ";
print " byte#223-224: ",$head_16bit_112, "\n ";
print " byte#225-226: ",$head_16bit_113, "\n ";
print " byte#227-228: ",$head_16bit_114, "\n ";
print " byte#229-230: ",$head_16bit_115, "\n ";
print " byte#231-232: ",$head_16bit_116, "\n ";
print " byte#233-234: ",$head_16bit_117, "\n ";
print " byte#235-236: ",$head_16bit_118, "\n ";
print " byte#237-238: ",$head_16bit_119, "\n ";
print " byte#239-240: ",$head_16bit_120, "\n ";
print "--------------First Trace Header 32 BIT-----------\n ";
print " byte# 1- 4: ",$head_32bit_001, "\n ";
print " byte# 5- 8: ",$head_32bit_003, "\n ";
print " byte# 9- 12: ",$head_32bit_005, "\n ";
print " byte# 13- 16: ",$head_32bit_007, "\n ";
print " byte# 17- 20: ",$head_32bit_009, "\n ";
print " byte# 21- 24: ",$head_32bit_011, "\n ";
print " byte# 25- 28: ",$head_32bit_013, "\n ";
print " byte# 29- 32: ",$head_32bit_015, "\n ";
print " byte# 33- 36: ",$head_32bit_017, "\n ";
print " byte# 37- 40: ",$head_32bit_019, "\n ";
print " byte# 41- 44: ",$head_32bit_021, "\n ";
print " byte# 45- 48: ",$head_32bit_023, "\n ";
print " byte# 49- 52: ",$head_32bit_025, "\n ";
print " byte# 53- 56: ",$head_32bit_027, "\n ";
print " byte# 57- 60: ",$head_32bit_029, "\n ";
print " byte# 61- 64: ",$head_32bit_031, "\n ";
print " byte# 65- 68: ",$head_32bit_033, "\n ";
print " byte# 69- 72: ",$head_32bit_035, "\n ";
print " byte# 73- 76: ",$head_32bit_037, "\n ";
print " byte# 77- 80: ",$head_32bit_039, "\n ";
print " byte# 81- 84: ",$head_32bit_041, "\n ";
print " byte# 85- 88: ",$head_32bit_043, "\n ";
print " byte# 89- 92: ",$head_32bit_045, "\n ";
print " byte# 93- 96: ",$head_32bit_047, "\n ";
print " byte# 97-100: ",$head_32bit_049, "\n ";
print " byte#101-104: ",$head_32bit_051, "\n ";
print " byte#105-108: ",$head_32bit_053, "\n ";
print " byte#109-112: ",$head_32bit_055, "\n ";
print " byte#113-116: ",$head_32bit_057, "\n ";
print " byte#117-120: ",$head_32bit_059, "\n ";
print " byte#121-124: ",$head_32bit_061, "\n ";
print " byte#125-128: ",$head_32bit_063, "\n ";
print " byte#129-132: ",$head_32bit_065, "\n ";
print " byte#133-136: ",$head_32bit_067, "\n ";
print " byte#137-140: ",$head_32bit_069, "\n ";
print " byte#141-144: ",$head_32bit_071, "\n ";
print " byte#145-148: ",$head_32bit_073, "\n ";
print " byte#149-152: ",$head_32bit_075, "\n ";
print " byte#153-156: ",$head_32bit_077, "\n ";
print " byte#157-160: ",$head_32bit_079, "\n ";
print " byte#161-164: ",$head_32bit_081, "\n ";
print " byte#165-168: ",$head_32bit_083, "\n ";
print " byte#169-172: ",$head_32bit_085, "\n ";
print " byte#173-176: ",$head_32bit_087, "\n ";
print " byte#177-180: ",$head_32bit_089, "\n ";
print " byte#181-184: ",$head_32bit_091, "\n ";
print " byte#185-188: ",$head_32bit_093, "\n ";
print " byte#189-192: ",$head_32bit_095, "\n ";
print " byte#193-196: ",$head_32bit_097, "\n ";
print " byte#197-200: ",$head_32bit_099, "\n ";
print " byte#201-204: ",$head_32bit_101, "\n ";
print " byte#205-208: ",$head_32bit_103, "\n ";
print " byte#209-212: ",$head_32bit_105, "\n ";
print " byte#213-216: ",$head_32bit_107, "\n ";
print " byte#217-220: ",$head_32bit_109, "\n ";
print " byte#221-224: ",$head_32bit_111, "\n ";
print " byte#225-228: ",$head_32bit_113, "\n ";
print " byte#229-232: ",$head_32bit_115, "\n ";
print " byte#233-236: ",$head_32bit_117, "\n ";
print " byte#237-240: ",$head_32bit_119, "\n ";