Wednesday, July 10, 2013

Meteo #4 - Cara Menyimpan Nilai Variabel GrADS ke File Teks/ASCII

Salah satu masalah yang seringkali dihadapi oleh para pengguna GrADS adalah pengolahan data dalam format teks. Contoh kasus, anda ingin mengolah data curah hujan TRMM atau GSMaP (dalam format binary atau NetCDF) dan menampilkannya ke dalam bentuk time series. Setelah grafik time series muncul di layar, anda mungkin berpikir, bagaimana kalau data hujan tadi dibandingkan dengan data time series yang lain, seperti indeks IOD atau NINO3.4. Masalahnya, format data indeks-indeks tadi adalah ASCII sedangkan data hujannya adalah binary. 

Ada dua cara, pertama, mengubah data time series indeks tadi ke format binary kemudian menampilkannya bersama data hujan di GrADS, atau yang kedua, mengubah data time series hujan tadi ke format ASCII, kemudian menampilkannya bersama data indeks di software lain seperti Excel atau Surfer. Saya lebih suka cara kedua. Alasannya jujur saja, Excel jauh lebih mudah digunakan dibanding GrADS. Opsi grafik di Excel juga lebih banyak. Jadi kita bisa menampilkan data time series dengan lebih mudah dan lebih menarik.

Pada tulisan kali ini, saya akan mengulas cara kedua, yaitu menyimpan data variabel atau hasil pengolahan pada GrADS ke dalam format file ASCII, sehingga bisa ditampilkan ke software statistik lain seperti Excel, Surfer, SPSS, atau sekedar Notepad.

Pertama, siapkan file data yang ingin anda buka atau olah dengan GrADS. Formatnya terserah, bisa plain binary, NetCDF, Grib, HDF atau yang lain. Yang penting masih bisa buka dengan GrADS.

Kedua, anda membutuhkan script fprintf.gs yang berisi fungsi untuk menyimpan argumen/variabel GrADS ke dalam file teks. Bila anda menggunakan OpenGrads di Windows, script ini berada dalam direktori C:\OpenGrADS\Contents\Resources\Scripts. Bila anda menggunakan GrADS di Linux (instalasi via Synaptic Package Manager), kemungkinan script ini belum tersedia. Bila memang belum ada, anda bisa menyalin script tersebut pada akhir tulisan ini.

Ketiga, tampilkan variabel atau hasil pengolahan data yang ingin anda simpan ke file ASCII. Misalnya, saya ingin menampilkan data time series dari data curah hujan harian GSMaP NRT di daerah 90E-110E, 10S-0S pada bulan Juni 2013.

ga-> open GSMaP_NRT.daily.00Z-23Z.ctl
ga-> set x 1
ga-> set y 1
ga-> set time 1jun2013 30jun2013
ga-> define chaave=tloop(aave(precip,lon=90,lon=110,lat=-10,lat=0))
ga-> d chaave

Normalnya, hasil yang akan muncul pada GrADS adalah seperti ini :


Langkah berikutnya, menyimpan data time series yang sudah ditampilkan GrADS ini ke file ASCII. Untuk melakukan hal tersebut, yang paling dibutuhkan adalah variabel atau argumen dari data yang ditampilkan sebelumnya, dalam hal ini adalah : chaave

Yang perlu diperhatikan, script fprintf.gs akan menyimpan isi dari variabel chaave tadi ke file teks dengan memanfaatkan perintah set gxout print dan set prnopts pada GrADS. Hal ini akan membuat GrADS mengubah mode grafik ke dalam mode teks, lalu menyimpan variabel/argumen GrADS ke file teks. Sebelum menggunakan script, tentukan format file teks yang anda inginkan dengan perintah set prnopts. Misalnya, saya ingin menyimpan isi variabel chaave ke data teks dengan 1 data per record (1 kolom per baris). Ketikkan :

ga-> set prnopts %g 1 1

Untuk info lebih lanjut tentang perintah set prnopts, silakan baca GrADS manual aja ya :-)

Langkah terakhir, tinggal jalankan script fprintf.gs dengan syntax :

fprintf <variabel/argumen> <nama file teks atau ASCII>

Untuk kasus kita, misal file ASCII-nya adalah testlagi.txt contohnya penulisannya adalah :

ga-> fprintf chaave testlagi.txt

Bila prosesnya lancar, GrADS akan menginfokan bahwa file teks tersebut berhasil dibuat. File tersebut sudah bisa dibuka dengan menggunakan software lain seperti Excel atau pengolah kata sederhana seperti Notepad.


Bila dibuka dengan Excel, lalu dibuat grafik hasilnya seperti ini : 


Selanjutnya anda bisa menambahkan data lain (misal indeks IOD dll) ke dalam grafik tersebut untuk analisis lebih lanjut. 

Mudah kan ? Semoga bermanfaat :-)

-------------------------------------------

Script fprintf.gs (copy setelah baris ini).

function fprintf(args)
* Command line argumets
* ---------------------
  expr = subwrd(args,1)
  file = subwrd(args,2)
  format = subwrd(args,3)
  numl = subwrd(args,4)
  numb = subwrd(args,5)
  u = subwrd(args,6)
  if ( file='' )
    say ''
    say 'NAME'
    say '     fprintf - print GrADS variables to a text file'
    say ''
    say 'SYNOPSIS'
    say '     fprintf  expr  txtFile  [format numl numb [u]]'
    say ''
    say 'DESCRIPTION'
    say '     Evaluates the contents of the GrADS expression *expr* writing'
    say '     its values to a formatted text file *txtFile*. On output, the'
    say '     number of values and the undef values are returned; a negative'
    say '     number of values signals an error condition.'
    say ''
    say '     Unlike the output of *set gxout print*, the resulting ASCII'
    say '     file has only the data values and *no header*.'
    say ''
    say 'OPTIONS'
    say '     The optional parameters are the same as the ones required by'
    say '     the GrADS command *set prnopts*, namely'
    say '     format   a C language template for formatting ASCII output.'
    say '              Default is %g.'
    say '     numl     number of values to print per record. Default is 8.'
    say '     numb     number of blanks to insert between values. Default is 1.'
    say '     u        print "Undef" instead of the numerical value for'
    say '              missing data.'
    say 'BUGS'
    say '     The GrADS expression cannot have spaces in it.'
    say ''    
    say 'COPYRIGHT'
    say '     This script has been placed in the public domain'
    say ''
    return
  endif
* Set the display environment and produce buffered ASCII output
* -------------------------------------------------------------
  'set gxout print'
  if ( format != '' )
    'set prnopts ' format ' ' numl ' ' numb ' ' u ' '
  endif
  'display ' expr
   if ( rc!=0 ); return -1; endif
*  Get rid of header line: Printing Grid -- 3358 Values -- Undef = 1e+20
*  but record number of values and undef values for later reference
*  ---------------------------------------------------------------------
   buffer = result
   i = 1; line = sublin(buffer,i)
   n = subwrd(line,4)
   undef = subwrd(line,9)
* Now write the data values to text file: first line...
* -----------------------------------------------------
  i = 2; line = sublin(buffer,i)
  if ( write_(file,line) > 0 ); return -2; endif
* Append subsequent lines
* -----------------------
  i = i + 1; line = sublin(buffer,i)
  while ( line != '' )
    if ( write_(file,line,append) != 0 ); return -3; endif 
    i = i + 1; line = sublin(buffer,i)
  endwhile
  if ( close(file) != 0 ); return -4; endif
* All done
* --------
  say 'wrote ' n ' values to file "' file '"'
  return n ' ' undef ' ' 
function write_(file,line)
   rc = write(file,line)
   return subwrd(rc,1)
   


35 comments:

  1. Ctl itu control file. Isinya informasi dimensi, variabel, dan opsi dari data binary yg akan dibuka GrADS.

    ReplyDelete
  2. bisa dibuat sendiri lewat notepad gk tu???
    nilai variabelnya dari mana??

    ReplyDelete
  3. Iya, bisa. Ctl itu file teks biasa, jadi bisa dibuat pake notepad, wordpad, gedit dll. Nilai dimensi dan variabel data harus diketahui sebelumnya sebelum membuat file Ctl. Kalo data binarynya kita buat sendiri, harusnya kita sudah tahu nilainya. Tapi kalo nggak tahu, ya harus cari informasi datanya dulu. Biasanya kalau kita download data binary, ada satu file readme yg berisi informasi dimensi dan variabel dari data tersebut.

    ReplyDelete
  4. mau nanya, apa definisi file dengan .ctl , .nc , .idx dan .gs ya? mhon bantuannya :)

    ReplyDelete
  5. ctl --> GrADS control file, berisi informasi dimensi dan variabel data plain binary. Ctl dipakai kalau data yang mau dibuka bertipe file binary biasa, bukan SDF (Self Describing File/Format). Dibuka dengan GrADS dengan perintah "open"

    nc --> Format NetCDF, data ini berjenis SDF, jadi informasi dimensi variabel dll sudah ada dalam satu file nc, sehingga tidak perlu file ctl untuk membuka data nc. Dibuka dengan GrADS menggunakan perintah "sdfopen"

    .idx --> File index untuk tipe data dengan format GRIB1/GRIB2. Agar data jenis ini bisa dibuka, dibutuhkan tiga file dengan ekstensi : grb(atau grb2), idx dan ctl. Dibuka dengan GrADS menggunakan perintah yang sama dengan data binary: "open".

    .gs --> GrADS Script file. Dipakai untuk menjalankan perintah-perintah GrADS dalam satu file script. Berguna kalau kita akan menjalankan banyak perintah GrADS secara berulang-ulang. Dengan script, proses ini bisa dipersingkat hanya dengan menjalankan script yang sudah berisi perintah-perintah GrADS tadi. Script dijalankan dengan perintah "run" atau langsung ketikkan nama scriptnya di prompt GrADS.

    Semoga membantu :-)

    ReplyDelete
    Replies
    1. Sebelum menggunakan software Grads kan perlu menyiapkan file dg format ".CTL", bagaimana langkah-langkah membuat file tersebut dr data misalnya data kelembapan udara yg telah kita download? Apakah bisa dishare langkah-langkah yg rinci dr mulai pada lembar kerja Wordpad? karena saya adalah pemula. Terima kasih sebelumya :)

      Delete
    2. Untuk membuat file CTL yg paling perlu diketahui adalah dimensi data yang bersangkutan. Misalnya mau membuka file data (binary) kelembaban udara, maka sebelum mendownload data tersebut kita perlu membaca deskripsi dari data tersebut, mulai dari rentang lintang, bujur, resolusi spasial dan temporal data tersebut, karena file CTL berisi informasi-informasi tersebut.

      Biasanya, penyedia data biasanya menyertakan file CTL pada direktori khusus yang bisa didownload pengguna bersama dengan data binary, sehingga pengguna tidak perlu membuat file CTL lagi. Misalnya pada server FTP TRMM/GSMaP.

      Untuk langkah-langkah membuat file CTL bisa dibaca di : http://iges.org/grads/gadoc/descriptorfile.html

      Semoga membantu.

      Delete
  6. mas kalo mau buka file NINO 3.4 itu dr notepad ke grads gimana ya? masih bingung saya

    ReplyDelete
    Replies
    1. File NINO 3.4 yg mau dibuka itu formatnya apa mb ? Kalo GrADS bisanya buka data dalam format binary. Jadi kl formatnya teks harus dikonversi dulu ke binary.

      Delete
    2. formatnya text document sih mas. nah saya bingung cara konversi datanya

      Delete
    3. kalau data Nino 3.4 mau dikonversi ini baiknya ke .ctl atau .nc ?

      Delete
    4. Kalau mau dibuka dengan GrADS, iya, harus dikonversi dulu ke binary (misalnya ke format nc). Kalau menurut saya sih, lebih baik file NINO tersebut dibuka dengan excel saja, kalau memang mau ngeplot biasa.

      Delete
  7. mau tanya mas
    mau buka file nc dalam jumlah banyak tpi dalam file nc itu mempunyai 1 parameter 1 waktu, karena cuma 1 waktu jadi saya mau buka dalam jumlah banyak file nc tersebut agar mencapai waktu yg diinginkan
    masalahnya saya mau menggabungin itu semua dengan hasil olahannya format ascii

    mhon bantuannya
    terima kasih


    regard
    robbi

    ReplyDelete
    Replies
    1. Salam mas Robi,

      Beberapa file nc bisa dibuka sekaligus, selama jumlah dimensinya sama, dengan menggunakan perintah xdfopen di GrADS.

      Misalnya data netCDF NCEP Reanalysis untuk RH Tahunan (http://www.esrl.noaa.gov/psd/cgi-bin/db_search/DBListFiles.pl?did=32&tid=50530&vid=615).

      Untuk membuka data-data tersebut sekaligus, kita perlu membuat 1 file teks/ASCII dengan ekstensi XDF (misal : RH.xdf). Isi file XDF tersebut kurang lebih sama dengan file CTL. Kalau CTL dibuka dengan perintah 'open', maka XDF dibuka dengan dengan perintah 'xdfopen'.

      Untuk lebih jelasnya silakan baca : http://cola.gmu.edu/grads/gadoc/gradcomdxdfopen.html

      Semoga membantu.

      Delete
  8. klo buat kecepatan angin apakah sama saja???

    ReplyDelete
  9. mas, mau tanya untuk mengubah data nc ke txt apakah langsung dari sdfopen data.nc lalu langsung fprintf chaave data.txt?

    ReplyDelete
    Replies
    1. Tergantung data yg mana yg mau disimpan ke file txt. Kl langsung nanti semua datanya kesimpan di file txt. Kl contoh di atas, yg disimpan cm data rata2 pd daerah tertentu aja.

      Delete
  10. ardi, aku udah fprintf file yg aku mau baca ke csv, masalah selanjutnya, aku ga nemu itu file dimana,, grads simpan file nya di mana yah? thanks

    ReplyDelete
    Replies
    1. Kalo nggak nemu, kemungkinan ada di folder instalasi GrADS. Misalnya : C:\OpenGrADS\Contents\Resources\SampleDatasets

      Delete
  11. Selamat Siang
    maaf mas saya ada data GSMaP RNL harian Selama 5 tahun dan sudah ada ctl nya.nah untuk mengetahui nilai curah hujan spasialnya dalam 1 tahun bagaimana ya mas?
    karena saat ini saya melakukan pemanggilan data tiap 1 hari mas.
    apakah harus diubah ctlnya atau pengaturan script GraDS nya mas?

    terima kasih

    ReplyDelete
    Replies
    1. Kalau datanya harian, dengan asumsi nama variabelnya 'precip', plot spasial tahunannya (annual) bisa pakai perintah 'sum'. Misalnya : 'd sum(precip,time=1jan2010,time=31dec2010)'.

      Delete
  12. kalo control filenya untuk 1 harian mas,
    DSET ^gsmap_rnl.20130902.0.1d.daily.00Z-23Z.v6.3133.0.dat (data 2 september 2013)
    TITLE GSMaP_MVK 0.1deg daily (V6.8.4)
    UNDEF -999.9
    OPTIONS YREV LITTLE_ENDIAN TEMPLATE
    XDEF 3600 LINEAR 0.05 0.1
    YDEF 1200 LINEAR -59.95 0.1
    zdef 1 levels 1000
    tdef 6000 linear 00:00z02sep2013 1dy
    VARS 1
    precip 0 99 hourly precip(mm/hr)
    ENDVARS

    apakah ctl ini ada yang diganti untuk 1 tahun data??, karena saya coba ganti time nya, gagal terus mas.mohon arahan.

    terima kasih

    ReplyDelete
  13. a.Data yang digunakan 5 tahun periode 2011-2015
    b. Bentuk data harian, contoh ctl harian
    DSET ^gsmap_rnl.20110101.0.1d.daily.00Z-23Z.v6.3133.0.dat (data 1 januari 2011)
    TITLE GSMaP_MVK 0.1deg daily (V6.8.4)
    UNDEF -999.9
    OPTIONS YREV LITTLE_ENDIAN TEMPLATE
    XDEF 3600 LINEAR 0.05 0.1
    YDEF 1200 LINEAR -59.95 0.1
    zdef 1 levels 1000
    tdef 6000 linear 00:00z01jan2011 1dy
    VARS 1
    precip 0 99 hourly precip(mm/hr)
    ENDVARS;
    c.karena penelitian 5 tahun saya berharap dalam variable precip bisa di panggil langsung 1 bulan atau tahunan.
    d.folder ctl yang sudah ada harus disimpen dalam 1 folder (misal .ctl 1 jan +data dalam bentuk .dat.

    tapi kalau .ctl nya bisa dalam 1 tahunan apakah 1 folder berisi .ctl tahunan+data .dat dalam 1 tahun juga?


    mohon arahn mas.

    terima kasih

    ReplyDelete
    Replies
    1. Coba pake template untuk buka banyak data sekaligus. Misal, bagian DSET dari file CTL-nya diedit jadi seperti ini:

      DSET ^gsmap_rnl.%y4%m2%d2.0.1d.daily.00Z-23Z.v6.3133.0.dat

      Seluruh data selama 5 tahun harus ada di folder yang sama dengan file CTL. Setelah itu jalankan GrADS, kalo mau buat plot untuk curah hujan total selama 1 tahun selama 2011 misalnya, pakai perintah:

      d sum(precip,time=1jan2011,time=31dec2011)

      Delete
    2. a. Alhamdulillah file ctl sudah bisa mas,
      Tapi di GrADS nya perintah d sum nya blom bisa mas. Dalam folder saya ada data bentuk dat dari 1 jan sampe 31 jan 2011 tapi kenapa value -9.99+08 ya mas?
      Apa maksudnya ya mas?


      b. mas, dalam GraDS kalau kita sudah membuka folder D (misal: D:/01jan2011/01jan.ctl)


      kemudian saya ingin membuka lagi D:/05jan2011/05jan.ctl)

      kenapa di window masih terbaca data yang D:/01jan2011/01jan.ctl ?

      apa ya scriptnya ya mas?

      c. mas konsultasi via email bisa mas?

      Delete
  14. Izin tanya. Kalau fprintf nya ke ascii itu cara supaya hasilnya bukan nilainya aja, tapi ada keterangan lintang sekian bujur skian nilainya skian, dst.. Gimana ya mas?

    ReplyDelete
    Replies
    1. Kalo cara normal ga bisa karena fprintf itu cuma memindahkan apa yg ada di layar ke dalam file ascii. Tapi sebenarnya masih bisa diakali dengan grads script (fungsi q transform).

      Delete
  15. mas, kalo mau ambil data rata2 rh dari lapisan 1000-100, gimana cara atur biar z nya looping, saya coba selalu error

    ReplyDelete
  16. Mas Ardhi saya mau tanya bagaimana cara konvert data GSMaP dengan format .dat ke .ctl?

    ReplyDelete
    Replies
    1. Data binary dat ga bisa diconvert ke ctl, mas. Karena file ctl itu cuma header/metadata, bukan data observasi.

      Delete
  17. mohon maaf, saya mau bertanya. untuk mengambil data harian selama satu bulan pada file ekstensi .nc dengan grads bagaimana ya karena saya masih pemula. tapi sudah saya coba beberapa kali masih belum berhasil. mohon bantuannya.

    ReplyDelete
  18. Mas, mau tanya. Saya mau save multiple varible dalam satu file ASCII. Misal: Precipitation dan Temperature. Saya sudah coba untuk cari di mailling list grads. Ada beberapa link yang diberikan namun tidak dapat saya kunjungi lagi. Apa mas pernah melakukan hal ini?

    Terima kasih banyak sebelumnya mas.

    ReplyDelete
    Replies
    1. Caranya sama dengan yg ditulis di atas, tinggal tambahkan aja variabel presipitasi.

      Delete