List routines by category:
Atmospheric Sciences |
Benchmarking |
Color |
Date/Time |
Doc |
File & I/O |
BPCH Format |
Scientific Data Formats |
GAMAP Examples |
GAMAP Internals |
GAMAP Utilities |
GAMAP Data Manipulation |
GAMAP Models &
Grids |
GAMAP Plotting |
General |
Graphics |
Math & Units |
Plotting |
Regridding |
Strings |
Structures |
Time Series
List routines by alphabetical order:
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z
NAME: EXAMPLES_MANIP_4D PURPOSE: Shows how to manipulate TS data saved as 4D array with GC_COMBINE_ND49 or GC_COMBINE_ND48. The routine loops over all available 4D data blocks and print information for each of them. CATEGORY: GAMAP Data Manipulation, GAMAP Examples, Time Series CALLING SEQUENCE EXAMPLES_MANIP_4D, File [ , Keywords ] INPUTS: FILE -> The name of the file created by GC_COMBINE_ND48/9. OUTPUT KEYWORD PARAMETERS: #### ONLY THE LAST DATA SET IF MORE THAN ONE IS AVAILABLE #### DATA -> Output keyword. Set to a variable name that will contain the data set on exist. LON -> Output keyword. Set to a variable name that will contain the vector of LONGITUDES on exit. LAT -> Output keyword. Set to a variable name that will contain the vector of LATITUDES on exit. TIME -> Output keyword. Set to a variable name that will contain the vector of TIME STEP on exit. Format is YYYYMMDD if daily max is asked for (see DMAX keyword), TAU value else. LOCALTIME -> to get the output TIME in LOCALTIME. If there is more than one longitude in the data block, TIME becomes an array : one vector for each longitude. KEYWORD PARAMETERS: MAVG -> The window size (boxcar) of the moving average, if you want to apply one. DMAX -> Return daily maximum of the TS. VERBOSE -> to print some basic information about the data set. _EXTRA=e -> Picks up extra keywords for routines OUTPUTS: With optional keyword. SUBROUTINES: REQUIREMENTS: References many routines from GAMAP package. Requires GAMAP v2.10 for handling 4D dataset. NOTES: EXAMPLES: file = dialog_pickfile() EXAMPLES_MANIP_4D, file, /v, data=ts, lat=lat, lon=lon, time=time PLOT, time-time[0], ts[0,0,0,*], title='Time series at lon='+ $ strtrim(lon[0],2)+' / lat='+strtrim(lat[0],2) MODIFICATION HISTORY: phs, 6 Jun 2007: GAMAP VERSION 2.10 - Initial version
(See /n/home09/ryantosca/IDL/gamap2/examples/examples_manip_4d.pro)
NAME: EXAMPLE_ND48_ND49 PURPOSE: Creates several example plots to illustrate the use of GAMAP timeseries routines GC_COMBINE_ND48 and GC_COMBINE_ND49. CATEGORY: GAMAP Examples, GAMAP Utilities, Time Series CALLING SEQUENCE: EXAMPLE_ND48_ND49 [, Keywords ] INPUTS: None KEYWORD PARAMETERS: /PNG -> Set this switch to save screen output Portable Network Graphics (PNG) format. OUTPUTS: None SUBROUTINES: External Subroutines Required: ========================================= GC_COMBINE_ND48 GC_COMBINE_ND49 MULTIPANEL PROGRAM_DIR (function) SCREEN2PNG REQUIREMENTS: Requires routines from the GAMAP package. NOTES: None EXAMPLE: EXAMPLE_ND48_ND49, /PNG ; Create example plots and save to PNG file. MODIFICATION HISTORY: bmy & phs, 13 Jul 2007: GAMAP VERSION 2.11
(See /n/home09/ryantosca/IDL/gamap2/examples/example_nd48_nd49.pro)
NAME: GC_COMBINE_ND48 PURPOSE: Combine timeseries data from the Geos-CHEM ND48 diagnostics contained in one or more binary punch files. The goal is to combine, for one station, all the data blocks (there is one per time step) into one single 4-D data block (we want the time to be the 4th dimension). This is basically to take advantage of support for 4D dataset in GAMAP v2-10. GEOS-Chem ND48 (as in v7-04-12) outputs one file for all stations and all time steps. GC_COMBINE_ND48 will write one file but each timeseries will be in one data block instead of as many as the number of timesteps. This will make reading the timeseries with CTM_GET_DATA a lot faster. Two basic signal processing before saving the data can be applied: moving average and/or daily maximum. LIMITATION: daily maximum will not make sense if series do not cover full days. CATEGORY: GAMAP Utilities, GAMAP Data Manipulation, Time Series CALLING SEQUENCE: GC_COMBINE_ND48 [, Keywords ] OPTIONAL INPUTS: By defaults all stations are processed. And one output file is created that contains all the stations timeseries. KEYWORD PARAMETERS: ;============ For I/O files/directory ===================== INFILE -> one or more station file(s) from ND48 diagnostic. If more than one file is processed, it is assumed that, once sorted in alphabetical order, they are in chronological order (this is automatically the case, if you insert YYYYMMDD into ND48 filenames in input.geos). INDIR -> Directory where to look for "stations" files. Can be either input or output keyword: Input: when defined, ALL files satisfying the MASK keyword in the directory will be selected. Ouput: set to a variable name that will contains the DIR of the selected files. It is ignored (both input and output roles) if INFILE is provided. If neither INFILE nor INDIR is set, then a dialog window that allows multiple files selection (keep CTRL or SHIFT key down) will pop-up. MASK -> Pattern Mask to find files in INDIR. Default is "stations*". OUTFILENAME -> Name of the file that will contain the new timeseries. Default is 'combined'+INFILE[0], in the same directory as stations file. If the full path is not included, the file is created in the working directory. The routine prevents from overwriting any input file. ;================= Data Selection ====================== STATIONNB -> Station(s) number. Can be one or more elements (up to the number of stations in ND48). Use to select a subset of the stations instead of all of them. TIME -> vector for selecting time span. The data covering [min(TIME),max(TIME)] are selected. If only one element, then the closest-in-time data is selected. If min and/or max of TIME is outside the range of available time steps, the first or last available time step is used. Note 1: this is also an output keyword. Then, if passed by reference, TIME becomes the time vector in output. See example (6). Note 2: if using DMAX or DAVG, then TIME should be long integer (YYYYMMDD), if not it should be Tau format. ;================= Signal Processing ====================== MAVG -> to apply a running average filter to the series. MAVG value will define the boxcar size and must be GE 3. Even numbers are increased by +1. The IDL SMOOTH routine is called and accept _extra keywords (NAN, EDGE_TRUNCATE, and MISSING). DMAX -> to select the daily maxima of the time series. If both MAVG and Dmax are set, the moving average is performed first and you get the daily max of the moving average. (Local time is not accounted for: days start and end at 0 UT everywhere). DAVG -> to select the daily average of the time series. If both MAVG and DAVG are set, the moving average is performed first and you get the daily average of the moving average. (Local time is not accounted for: days start and end at 0 UT everywhere). ;================= Output keywords ======================== All the following keywords will apply to only ONE station. The last one is used if none or more than one is requested. DATA -> set to a variable name that will hold the selected timeseries data on exit. This is a 4D array (1,1,lev,time) even though only one station is selected. LON -> set to a variable name that will hold the longitude of the data set on exit. LAT -> set to a variable name that will hold the latitude of the data set on exit. LEV -> set to a variable name that will hold the vector of levels for the data set on exit. TIME -> set to a variable name that will hold the time vector for the station on exit. Given as Tau values, unless DMAX or DAVG is set, then as YYYYMMDD. LOCALTIME -> if set, the TIME vector is in local time instead of UT. Has no effect if /DMAX or /DAVG. ;================= Others ======================== NOSAVE -> set to not save output into a BPCH file. Useful if you just want to check results with output keywords. VERBOSE -> Set to print informational message about the time series. particularly useful to double check area/location selected with subset keywords. _EXTRA=e -> Picks up extra keywords for SMOOTH and DIALOG_PICKFILE. OUTPUTS: See output keywords above. SUBROUTINES: REQUIREMENTS: References many routines from GAMAP package. Requires GAMAP v2.10 for handling 4D dataset. NOTES: If memory issues show up, try to save one timeseries (i.e., one station at a time). EXAMPLES: ;; (1) Read multiple timeseries files selected w/ a pop-up window (use SHIFT key for muliple selections). Save with the default filename in the default directory: GC_COMBINE_ND48 ;; (2) Like example (1), but saves only the daily max of the ;; 9-hours average timeseries: GC_COMBINE_ND48, /dmax, mavg=8 ;; (3) read ALL stations files from directory '~/path/' ;; without a pop-up window (no interactivity, good for batch ;; processing). Default MASk and outfile name are used. GC_COMBINE_ND48, indir='~/path/' ;; (4) Like example (3) but select only the first available ;; station, and save the result in a specified file: GC_COMBINE_ND48, Station=1, indir='~/path/', outfile='~/path/series1.bpch' ;; (5) read files from directory '~/path/', and select 3rd station. ;; Do not save combined timeseries. Get outputs in variables ;; data, lon, lat and time. GC_COMBINE_ND48, indir='~/path/', station=3, data=data, lon=lon, lat=lat, time=time Help, reform(data) PLOT, time, data[0,0,0,*], title='Lon= strtrim(lon,2)+'- Lat='+strtrim(lat,2) ;; (6) Like (5), but limit the time to 23rd-28th of July ;; 2001. Not the use of two commands to get the output ;; time vector. time = [nymd2tau(20010723L,20010728l)] GC_COMBINE_ND48, indir='~/path/', station=3, data=data, lon=lon, lat=lat, time=time HELP, time MODIFICATION HISTORY: phs, 31 Jul 2007: GAMAP VERSION 2.10 - Initial version phs, 11 Oct 2007: - few bugs fix - added output keywords phs, 15 Oct 2007: - added LOCALTIME keyword phs, 18 Oct 2007: - do not save if output file is one of the input file. phs, 26 Oct 2007: - TIME can be use to select the time span of the series. Added DAVG keyword. phs, 30 Oct 2007: - couple of minor fixes. phs, 11 Aug 2009: - major fix: bug fix when same tracer in several stations bmy, 12 Mar 2009: GAMAP VERSION 2.14 - Typo at line 429 fixed
(See /n/home09/ryantosca/IDL/gamap2/timeseries/gc_combine_nd48.pro)
NAME: GC_COMBINE_ND49 PURPOSE: Combine timeseries data from several bpch files into 4D data. Typically used with Geos-CHEM ND49 timeseries output and met fields in bpch files (a3, a6, i6). For met fields, see example (9) and (10). Each ND49 and Met Fields file has data for one day. But, files with time series that do no cover a day per file, can also be processed. See example (11), but keep in mind that the daily max or average options are then **** MEANINGLESS ****, and should not be used. WHAT IS DONE: (1) We combine all the data blocks for one tracer (there is one per time step) into one single 4-D data block (with time in 4th dimension). This takes advantage of support for 4D dataset introduced in GAMAP v2-10. (2) The combined series can be saved into a binary punch file. You end up with one file per tracer that covers many days of output, instead of one file per day for all tracers. The space saving can be more than 60%. (3) A subarea (even a single location) can be extracted. But for multiple but not contiguous locations, call the routine as many time as needed. (4) Shorter timeseries can be selected/saved, by specifying Tau range, or day (as YYYYMMDD long integer) range if daily max or average is selected. (5) Two basic signal processing before saving the data can be performed: moving average and/or daily maximum/minimum/average. ## LIMITATION ## : full days considered for ND49, ie, GEOS-Chem runs should start and end at midnight (YYYYMMDD 000000 in input.geos) CATEGORY: GAMAP Utilities, GAMAP Data Manipulation, Time Series CALLING SEQUENCE: GC_COMBINE_ND49 [, TRACER ][, CATEGORY ][, Keywords ] INPUTS: TRACER -> The tracer number. Default is 1. CATEGORY -> The category name (default is "IJ-AVG-$") for which to read data. KEYWORD PARAMETERS: ;============ For I/O files/directory ===================== FILELIST -> list of files to process. Usually used as output keyword to get the list of files selected with INDIR and MASK or through a dialog window. Can be used as input. Then INDIR and MASK are ignored. INDIR -> Directory where to look for MASK files. If provided, ALL files satisfying the MASK keyword in the directory will be selected. If not provided, a dialog window that allows multiple files selection (keep SHIFT key down) will pop-up. See EXAMPLES below for tips. If set to an undefined variable name, it will hold the directory of the selected files (output keyword). NOTE: If more than one file is processed, it is assumed that, once sorted in alphabetical order, they are in chronological order (this is the case with GEOS-Chem default naming of ND49 output files: they contain YYYYMMDD). MASK -> Pattern Mask to find files in INDIR. Default is "ts*.bpch". OUTDIR -> Output directory where to save the file with the new timeseries data set will be. Default is INDIR. If the user has not write permission in INDIR, writintg is cancelled. OUTFILENAME -> Name of the file that will contain the timeseries. Default is 'combts_%TRACERNAME%.bpch', for COMB ined T ime S eries. The routine prevents from overwriting any input file. ;============ To extract subset of data =================== LON -> A one or two-elements vector specifying the longitude of one location or one area. If LON is outside the ND49 area, the program print a warning, and uses border value. LAT -> same as LON, but for Latitudes LEV -> same as LON, but for Levels. Refers to the model grid. ; - - you can also select indices into the requested 3D cube: LLEV -> A one or two-element vector specifying the min and max of available levels to be included in the file. Default is ALL available levels. Default FORTRAN indexing is used: LLEV #1 is the first level ***requested*** in ND49. See LEV above otherwise. ILON, JLAT -> same as LLEV but for Longitude and Latitude indices. Starting at 1 at the first ***requested*** grid box in ND49. TIME -> vector for selecting time span. The data covering [min(TIME),max(TIME)] are selected. If only one element, then the closest-in-time data are selected. TIME must be given as Tau (double) or YYYYMMDD (long) if /DMAX or /DAVG. If both DMAX (or DAVG) and LOCALTIME are set, TIME is ignored. ** TIP ** if you select a short time span, it may be useful to limit the number of files to process by redefining MASK or using FILELIST. That will speed up the process. ;================= Signal Processing ====================== MAVG -> to apply a running average filter to the series. MAVG value will define the boxcar size and must be GE 3. Even numbers are increased by +1. The IDL SMOOTH routine is called and accept _extra keywords (NaN, Edge_truncate, missing). DMAX -> to select the daily maxima of the time series. If both MAVG and Dmax are set, the moving average is performed first and you get the daily max of the moving average. DAVG -> to select the daily average of the time series. If both MAVG and DAVG are set, the moving average is performed first and you get the daily average of the moving average. LOCALTIME -> to get DAVG or DMAX computed over local days instead of UT days. See details below. ;================= Output keywords ======================== DATA -> set to a variable name that will hold the selected timeseries data on exit. This is a 4D array (nLon, nLat, nLevel, ntime) even if only one location is selected. OUTLON -> set to a variable name that will hold the vector of longitudes of the data set on exit. OUTLAT -> set to a variable name that will hold the vector of latitudes of the data set on exit. OUTLEV -> set to a variable name that will hold the vector of Levels of the data set on exit. OUTALT -> set to a variable name that will hold the vector of altitudes for the data set on exit. OUTTIME -> set to a variable name that will hold the time vector corresponding to the data set on exit. Format is Tau, or YYYYMMDD if /DMAX. LOCALTIME -> if set, OUTTIME becomes a Nb_OutLon X Nb_TimeStep array, with each vector OUTTIME[i,*] holding the time vector in local time instead of UT. That vector will apply to all j and k for DATA[i,j,k,*]. Specific case of... both DMAX (or DAVG) and LOCALTIME being set. The daily max (average) is obtained after shifting the timeseries, so they start at 00 LT everywhere (or the first available time step just before 00 LT). The first max (average) value is for the first complete local day of the series. The OUTTIME array is then a [numbers of complete days, 2] array that gives the local YYYYMMDD for both positive and negative longitudes. See also note about TAU0/TAU1 below. Note that the time step of the series must be small enough for the DMAX/DAVG w/r/t Local Time to be reliable. ;================= Others ======================== NOSAVE -> set to not save output into a BPCH file. Useful if you just want to check results with output keywords. VERBOSE -> Set to print informational message about the time series. Particularly useful to double check the area/location selected with subset keywords. _EXTRA=e -> Picks up extra keywords for SMOOTH and DIALOG_PICKFILE. OUTPUTS: See output keywords above. SUBROUTINES: REQUIREMENTS: References many routines from GAMAP package. Requires GAMAP v2.10 for saving 4D dataset into binary punch file. NOTES: ######## ND49 and Met Fields only. For ND48, see ######## ######## GC_COMBINE_ND48 (not as well maintained) ######## Written with batch processing in mind. It is recommended to save all ND49 outputs into one dedicated directory, and to use keywords (INDIR, OUTDIR, OUTFILE..) and save the new combined timeseries in a new directory. About TAU0 and TAU1 : in the DataInfo structure, they are set to the beginning and end of the timeseries. For daily data, we compute them by setting HH:MM:SS to 00:00:00. If LocalTime is set, UT is still used for TAU0 and TAU1, so we can use only one value. If both LocalTime and DMAX are set, tau0 and tau1 give the first and last (local) days for longitudes less than 0 (west). For East longitudes, you need to add one day to these to get the correct date. EXAMPLES: ;; In the following examples, it is assumed that tracer 1 ;; has been saved with ND49 ;; (1) Read multiple timeseries files selected w/ a pop-up window (use SHIFT key for muliple selections). Saved series at ALL available locations into default directory and filename: GC_COMBINE_ND49 exactly the same as: GC_COMBINE_ND49, 1, 'IJ-AVG-$' ;; (2) Like example (1), but saves only the daily max of the ;; 9-hours average timeseries: GC_COMBINE_ND49, 1, 'IJ-AVG-$', /dmax, mavg=8 ;; (3) Like example (1), but do not save the timeseries. Get ;; the timeseries in the variable TS in output: GC_COMBINE_ND49, 1, 'IJ-AVG-$', /nosave, data=TS ;; (4) read **ALL** MASK-files from directory '~/path/' ;; without a pop-up window (no interactivity, good for batch ;; processing): GC_COMBINE_ND49, 1, 'IJ-AVG-$', indir='~/path/', outfile='series1.dat' ;; (5) Like example (4), but with selection of ONE station: GC_COMBINE_ND49, 1, 'IJ-AVG-$', indir='~/path/', outfile='station1.bpch',$ lon=-65., lat=45., lev=1 ;; (6) Like example (5), but with shorter time series (from ;; 2001/7/20 20:00 to 2001/7/23 2:00): GC_COMBINE_ND49, 1, 'IJ-AVG-$', indir='~/path/', outfile='station1.bpch',$ lon=-65., lat=45., lev=1, $ Time=[nymd2tau(20010720l,200000l),nymd2tau(20010723l,20000l)] ;; (7) Like example (6), but select Daily Max and for few ;; days only (from 23rd to 28th of July 2001): GC_COMBINE_ND49, 1, 'IJ-AVG-$', indir='~/path/', outfile='station1.bpch',$ lon=-65., lat=45., lev=1, /DMax, Time=[20010723L,20010728L] ;; (8) read **ALL** MASK-files from a directory selected with ;; a pop-up window: GC_COMBINE_ND49, 1, 'IJ-AVG-$', indir=dialog_pickfile(/dir) ;; (9) read CLOUD FRACTION from GEOS-4 met fields. Interactive way. GC_COMBINE_ND49, nosave=1, data=ts, $ mask='/as/data/master/ctm/GEOS_4x5.d/GEOS_4_v4/1985/02/*a6*', $ 7, 'GMAO-2d', outtime=time ;; (10) read CLOUD FRACTION from GEOS-4 met fields. All data from February 1985 automatically: GC_COMBINE_ND49, nosave=1, data=ts, $ indir='/as/data/master/ctm/GEOS_4x5.d/GEOS_4_v4/1985/02/', $ mask='*a6*', $ 7, 'GMAO-2d', outtime=time ;; (11) Read 3 series of 2004 GFED2 emissions (3hr, 8-day and monthly): ; -- get data from MASK and DIRECTORY dir3hr = '/as/data/geos/GEOS_1x1/GFED2_3hr_200901/2004/' dirMon = '/as/data/geos/GEOS_1x1/GFED2_200601/2004/' dir8day = '/as/data/geos/GEOS_1x1/GFED2_8day_200712/2004/' mask3hr = 'GFED2.3hr.C_20040*.generic.1x1' maskMon = 'GFED2_C_2004*.generic.1x1' mask8day = 'GFED2_8day_C_2004*.generic.1x1' gc_combine_nd49, 99, 'GFED2-BB', /nosave, data=d3hr, $ mask=mask3hr, indir=dir3hr, outTime=tau3hr, /verb gc_combine_nd49, 99, 'GFED2-BB', /nosave, data=d8day, $ mask=mask8day, indir=dir8day, outTime=tau8day, /verb gc_combine_nd49, 99, 'GFED2-BB', /nosave, data=dMon, $ mask=maskMon, indir=dirMon, outTime=tauMon, /verb ;-- Julian Time for each data set (the half time step is added to ; get the time series centered on their period, since we plot ; histograms, with psym=10) temp = tau2yymmdd( tau3hr + 1.5 ) Jul3hr = JulDay(temp.month, temp.day, temp.year, temp.hour, temp.minute) temp = tau2yymmdd( tau8day + (4.*24.) ) Jul8day = JulDay(temp.month, temp.day, temp.year, temp.hour, temp.minute) temp = tau2yymmdd(tauMon + 15.*24.) JulMon = JulDay(temp.month, temp.day, temp.year, temp.hour, temp.minute) ; -- convert from [g C/m2/time-period] to [Tg C/time-period] GridInfo = CTM_GRID( CTM_TYPE( 'generic', res=[1., 1.] ) ) Surface = CTM_BOXSIZE( GridInfo, /cm2 ) dim = size(surface, /dimensions) d3hr = d3hr * rebin( Surface, dim[0], dim[1], 1, (size(d3hr))[4] ) d8day = d8day * rebin( Surface, dim[0], dim[1], 1, (size(d8day))[4] ) dMon = dMon * rebin( Surface, dim[0], dim[1], 1, (size(dMon))[4] ) d3hr = d3hr * 1e-9 d8day = d8day * 1e-9 dMon = dMon * 1e-9 ; -- Sum data over space, and convert to [ Tg C/s ] sum3hr = total( total( total(d3hr, 1), 1), 1) / (3. * 3600.) sum8day = total( total( total(d8day, 1), 1), 1) / (8. *24. * 3600.) ; -- Plot time series dummy = label_date( date_format=['%D', '%M'] ) plot, Jul3hr, sum3hr, /ynozero, color=!myct.black, $ title='Total GFED2 emissions in 2004 (Tg C/sec)', $ /xstyle, $ xtickformat=['label_date', 'label_date', 'label_date'], $ xtickunit=['day', 'month'], $ position=[0.1, 0.15, 0.9, 0.9], $ psym=10 oplot, Jul8day, sum8day, thick=2., color=!myct.black, psym=10 MODIFICATION HISTORY: phs, 6 Jun 2007: GAMAP VERSION 2.05 - Initial version phs, 25 Jul 2007: GAMAP VERSION 2.10 - added Moving Average and Daily Max as signal processing available before saving/passing data. - added Lon and Lat keywords to select one location or a smaller area. - added output keywords. phs, 4 Oct 2007: - Bug fix for OUTTIME keyword phs, 12 Oct 2007: - Added OUTLEV output keyword, and LEV input keyword. - INDIR can be used as output keyword. phs, 15 Oct 2007: - added LOCALTIME keyword phs, 18 Oct 2007: - do not save if output file is one of the input file. phs, 26 Oct 2007: - bug fix for LON and LAT - added TIME keyword to limit timeseries in time. phs, 28 Oct 2007: - DMAX accounts for LOCALTIME if set. - Bug fix for OutTime when /DMax. phs, 04 Apr 2008: GAMAP VERSION 2.12 - added DAVG keyword - now cleanup the /no_global pointers - added the FILELIST keyword phs, 17 Jul 2008: - Added comments phs, 15 Aug 2008: GAMAP VERSION 2.13 - Bug fix for OutTime when /DMax or /DMean and input are from at least two different months mb & phs, 02 Dec 2008: - DIM is forced to 32-bit integer (LONG) phs, 08 Jan 2009: - Now can process files that cover time periods different from one day. bmy, 14 Apr 2010: GAMAP VERSION 2.14 - Add _EXTRA=e to CTM_GET_DATA so as to pass down any flags for nested grids
(See /n/home09/ryantosca/IDL/gamap2/timeseries/gc_combine_nd49.pro)