Commit 15a956d5 authored by Carl Schreck's avatar Carl Schreck
Browse files

Automated Nightly Commit - Thu Dec 11 00:01:03 EST 2014

parent 3503bc01
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sub.draw_wk99_trend.ncl
; Carl Schreck (cjschrec@ncsu.edu)
; December 2014
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Description: Draw the difference between the spectra in two periods
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/diagnostics_cam.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/time_axis_labels.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl"
load "$CJS_NCL_LIB/print_clock.ncl"
load "$CJS_NCL_LIB/kf_latwindow.ncl"
load "$CJS_NCL_LIB/kf_draw.ncl"
undef ( "draw_wk99_trend" )
function draw_wk99_trend( \
io_wks : graphic, \
i_data[*][*][*] : numeric, \
i_obsPerDay : integer, \
i_symString : string, \
i_res : logical \
)
begin ; draw_wk99_trend
; These are some parameters that could be useful to have up top
window = 96 * 2
overlap = 64 * 2
timeUnits = "days since 1800-01-01 00:00:00"
earlyStart = cd_inv_calendar( 1981, 01, 01, 00, 0, 0, timeUnits, 0 )
earlyEnd = cd_inv_calendar( 1990, 01, 01, 00, 0, 0, timeUnits, 0 )
lateStart = cd_inv_calendar( 2001, 01, 01, 00, 0, 0, timeUnits, 0 )
lateEnd = cd_inv_calendar( 2010, 01, 01, 00, 0, 0, timeUnits, 0 )
drawSymCurves = i_symString.ne."anti"
drawAntiCurves = i_symString.ne."sym"
print_clock( "Early" )
earlyPower = kf_latwindow( i_data({earlyStart:earlyEnd},:,:), i_obsPerDay, \
window, overlap, i_symString )
print_clock( "Middle" )
midPower = kf_latwindow( i_data({earlyEnd:lateStart},:,:), i_obsPerDay, \
window, overlap, i_symString )
print_clock( "Late" )
latePower = kf_latwindow( i_data({lateStart:lateEnd},:,:), i_obsPerDay, \
window, overlap, i_symString )
allPower = ( earlyPower + midPower + latePower ) / 3
copy_VarMeta( earlyPower, allPower )
; earlyPower = log10(earlyPower)
; latePower = log10(latePower)
diffPower = latePower - earlyPower
diffPower = diffPower / allPower
copy_VarMeta( earlyPower, diffPower )
printMinMax( diffPower, True )
retVal = kf_draw( io_wks, diffPower(freq|:,k|:), "None", drawSymCurves, \
drawAntiCurves, i_res )
cntRes = True
cntRes@gsnLeftString = ""
cntRes@gsnRightString = ""
cntRes@gsnDraw = False
cntRes@gsnFrame = False
cntRes@cnInfoLabelOn = False
cntRes@cnLineThicknessF = 2
cntRes@cnLineLabelsOn = False
cntRes@cnLineColor = "black"
cntRes@gsnContourNegLineDashPattern = 0
cntRes@gsnContourPosLineDashPattern = 0
cntRes@gsnContourZeroLineThicknessF = 0
allPower = log10(allPower)
cont = gsn_csm_contour( io_wks, allPower(freq|:,k|:), cntRes )
overlay( retVal, cont )
return(retVal)
end; draw_wk99_trend
......@@ -13,10 +13,9 @@ load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/diagnostics_cam.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/ut_string.ncl"
load "$CJS_NCL_LIB/kf_window.ncl"
load "$CJS_NCL_LIB/kf_curves.ncl"
load "$CJS_NCL_LIB/kf_outline.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl"
load "$CJS_NCL_LIB/kf_latwindow.ncl"
load "$CJS_NCL_LIB/kf_draw.ncl"
load "$CJS_NCL_LIB/print_clock.ncl"
begin ; main
......@@ -35,7 +34,7 @@ begin ; main
fontHeightF = 0.02
print( "Reading the data..." )
fileName = "/home/carl/data/olr/cdr/" + sensor + ".anom.nc"
fileName = "/home/carl/data/olr/compare/" + sensor + "/olr.anom.nc"
fin = addfile( fileName, "r" )
timeUnits = fin->time@units
print( (/ timeUnits /) )
......@@ -51,30 +50,12 @@ begin ; main
do t = 0, dimsizes(data&time)-1
miss = num( ismissing( data(t,:,:) ) )
if( miss.ne.0 ) then
print( ut_string( data&time(t), "" ) + ": " + miss )
; print( cd_string( data&time(t), "" ) + ": " + miss )
end if
end do
; Find north and south
north = data(time|:,{lat|0:},lon|:)
south = data(time|:,{lat|:0:-1},lon|:)
sym = ( north(:,0:,:) + south(:,0:,:) ) / 2
anti = ( north(:,0:,:) - south(:,0:,:) ) / 2
copy_VarMeta( north(:,0:,:), sym )
copy_VarMeta( north(:,0:,:), anti )
print( (/ sym&lat(1) /) )
symPower = kf_window( sym(lat|1,lon|:,time|:), obsPerDay, window, overlap )
antiPower = kf_window( anti(lat|1,lon|:,time|:), obsPerDay, window, overlap )
do y = 2, dimsizes(sym&lat)-1
print( (/ sym&lat(y) /) )
symPower = symPower + kf_window( sym(lat|y,lon|:,time|:), \\
obsPerDay, window, overlap )
antiPower = antiPower + kf_window( anti(lat|y,lon|:,time|:), \\
obsPerDay, window, overlap )
end do
symPower = symPower / dimsizes(sym&lat)
antiPower = antiPower / dimsizes(anti&lat)
symPower = kf_latwindow( data, obsPerDay, window, overlap, "sym" )
antiPower = kf_latwindow( data, obsPerDay, window, overlap, "anti" )
; Make the power for the time-mean to be missing
; Otherwise it would overshadow the actual signal
......@@ -100,234 +81,31 @@ begin ; main
end if
wks = gsn_open_wks( plotTypeLocal, plotName )
gsn_merge_colormaps( wks, "posneg_carl", "default" )
; Customize base plot
res = True
res@gsnDraw = False
res@gsnFrame = False
res@gsnLeftString = ""
res@gsnRightString = ""
; ...standardize the font sizes
res@cnInfoLabelFontHeightF = fontHeightF
res@gsnLeftStringFontHeightF = fontHeightF
res@gsnRightStringFontHeightF = fontHeightF
res@lbTitleFontHeightF = fontHeightF
res@lbLabelFontHeightF = fontHeightF
res@tiMainFontHeightF = fontHeightF * 1.3
res@tiYAxisFontHeightF = fontHeightF
res@tiXAxisFontHeightF = fontHeightF
res@tmXBLabelFontHeightF = fontHeightF
res@tmYLLabelFontHeightF = fontHeightF
; ...shading resources
res@cnFillOn = True
; res@cnFillMode = "AreaFill"
res@cnRasterSmoothingOn = True
res@cnMonoFillColor = False
res@cnInfoLabelOn = False
res@cnLineLabelsOn = False
res@cnLinesOn = True
res@cnLineColor = "gray"
res@cnMissingValFillPattern = "SolidFill"
res@cnMissingValFillColor = "gray"
; ...set the contour levels
res@gsnSpreadColors = True
res@gsnSpreadColorStart = 10
res@gsnSpreadColorEnd = 18
res@cnLevelSelectionMode = "ManualLevels"
; good for utwv
res@cnLevelSpacingF = .3
res@cnMinLevelValF = -3.3
res@cnMaxLevelValF = -1.2
; good for olr
res@cnLevelSpacingF = .3
res@cnLevelSelectionMode = "ManuelLevels"
res@cnLevelSpacingF = 0.3
res@cnMinLevelValF = -1.8
res@cnMaxLevelValF = 0.3
; ...labelbar resources
res@lbLabelBarOn = False
res@lbLabelAutoStride = True
res@lbOrientation = "Horizontal"
res@lbTitlePosition = "Right"
res@lbTitleDirection = "Across"
res@pmLabelBarOrthogonalPosF = fontHeightF * 10
res@pmLabelBarHeightF = fontHeightF * 2
res@cnMissingValFillPattern = "SolidFill"
res@cnMissingValFillColor = "gray"
; set up the right axis for period
res@tmYUseLeft = False
res@tmYRLabelsOn = True
res@tmYROn = True
res@tmYRMode = "Explicit"
res@tmYRLabels = (/ 48, 20, 10, 6.67, 5, 4, 3.33, 2.86, 2.5, 2.22, 2, 1.82, 1.67, 1.54, 1.43, 1.33, 1.25 /)
res@tmYRValues = 1 / res@tmYRLabels
res@gsnLeftString = "a) Anti-symmetric " + str_upper(sensor)
res@trYMinF = 0.0
res@trYMaxF = 0.5
res@trXMinF = -20
res@trXMaxF = 20
; res@trYMinF = 0.1
; res@trYMaxF = 0.3
; res@trXMinF = 10
; res@trXMaxF = 20
print( min( antiPower({freq|:},{k|-20:20}) ) + " " \\
+ max( antiPower({freq|:},{k|-20:20}) ) )
; res@tmYROn = False
res@tiYAxisString = "Frequency (CPD)"
res@tiYAxisSide = "Left"
plotA = gsn_csm_contour( wks, antiPower(freq|:,k|:), res )
plotA = kf_draw( wks, antiPower(freq|:,k|:), "None", False, True, res )
res@gsnLeftString = "b) Symmetric " + str_upper(sensor)
print( min( symPower({freq|:.51},{k|-20:20}) ) + " " + max( symPower({freq|:.51},{k|-20:20}) ) )
; res@tmYROn = True
; res@tmYLOn = False
res@tiYAxisString = "Period (days)"
res@tiYAxisSide = "Right"
plotB = gsn_csm_contour( wks, symPower(freq|:,k|:), res )
; add annotations
kf_curves( wks, plotA, 8, False, True )
kf_curves( wks, plotA, 90, False, True )
kf_curves( wks, plotB, 8, True, False )
kf_curves( wks, plotB, 90, True, False )
; add the gridlines
resLine = True
resLine@gsLineDashPattern = 2
line30A = gsn_add_polyline( wks, plotA, (/ -99, 99 /), 1./ (/ 30, 30 /), resLine )
line6A = gsn_add_polyline( wks, plotA, (/ -99, 99 /), 1./ (/ 6, 6 /), resLine )
line3A = gsn_add_polyline( wks, plotA, (/ -99, 99 /), 1./ (/ 3, 3 /), resLine )
line0A = gsn_add_polyline( wks, plotA, (/ 0, 0 /), (/ 0, 99 /), resLine )
line30B = gsn_add_polyline( wks, plotB, (/ -99, 99 /), 1./ (/ 30, 30 /), resLine )
line6B = gsn_add_polyline( wks, plotB, (/ -99, 99 /), 1./ (/ 6, 6 /), resLine )
line3B = gsn_add_polyline( wks, plotB, (/ -99, 99 /), 1./ (/ 3, 3 /), resLine )
line0B = gsn_add_polyline( wks, plotB, (/ 0, 0 /), (/ 0, 99 /), resLine )
; add the significant periods
resTx = True
resTx@txFontHeightF = 0.015
day30A = gsn_add_text( wks, plotA, "30 days", 17, .043, resTx )
day6A = gsn_add_text( wks, plotA, "6 days", 17, .176, resTx )
day3A = gsn_add_text( wks, plotA, "3 days", 17, .343, resTx )
day30B = gsn_add_text( wks, plotB, "30 days", 17, .043, resTx )
day6B = gsn_add_text( wks, plotB, "6 days", 17, .176, resTx )
day3B = gsn_add_text( wks, plotB, "3 days", 17, .343, resTx )
; add some other annotations....
boxRes = True
boxRes@gsnFrame = False
boxRes@gsnDraw = False
boxRes@xyLineColor = "magenta"
boxRes@xyLineThicknessF = 4
if( False ) then
xK06 = (/ -20, -20, -6, -6, -20 /)
yK06 = (/ 0.5, 0.3, 0.133, 0.333, 0.5 /)
k06A = gsn_csm_xy( wks, xK06, yK06, boxRes )
overlay( plotA, k06A )
k06B = gsn_csm_xy( wks, xK06, yK06, boxRes )
overlay( plotB, k06B )
end if
mis = -999
mis@_FillValue = -999
; Roundy & Frank (2004)
if( False ) then
kf_outline( wks, plotA, False, 2.5, 17, 1, 14, 8, 90, "Kelvin" )
kf_outline( wks, plotA, False, 30, 96, 0, 9, mis, mis, "None" )
kf_outline( wks, plotA, False, 3, 96, -10, -1, 8, 90, "MRG" )
kf_outline( wks, plotA, False, 2.5, 5, -20, -6, 90, mis, "MRG" )
kf_outline( wks, plotA, False, 9.7, 48, -14, -1, mis, mis, "None" )
kf_outline( wks, plotB, False, 2.5, 17, 1, 14, 8, 90, "Kelvin" )
kf_outline( wks, plotB, False, 30, 96, 0, 9, mis, mis, "None" )
kf_outline( wks, plotB, False, 3, 96, -10, -1, 8, 90, "MRG" )
kf_outline( wks, plotB, False, 2.5, 5, -20, -6, 90, mis, "MRG" )
kf_outline( wks, plotB, False, 9.7, 48, -14, -1, mis, mis, "None" )
end if
; Kiladis 2009 and others
if( True ) then
kfRes = True
; kfRes@xyLineColor = "red"
; kfRes@xyLineColor = "magenta"
; kfRes@xyDashPattern = 2
kfRes@xyLineThicknessF = 4
kfRes@xyLineColor = "blue"
kf_outline( wks, plotA, kfRes, 2.5, 17, 1, 14, 8, 90, "Kelvin" )
; kfRes@xyLineColor = "cyan"
; kf_outline( wks, plotA, kfRes, 2.5, 5, -20, -6, mis, mis, "None" )
kfRes@xyLineColor = "blue"
kf_outline( wks, plotA, kfRes, 30, 96, 0, 9, mis, mis, "None" )
; kfRes@xyLineColor = "red"
; kf_outline( wks, plotA, kfRes, 2.5, 10, -10, -1, 8, 90, "MRG" )
kfRes@xyLineColor = "blue"
kf_outline( wks, plotA, kfRes, 05, 72, -10, -1, mis, 90, "ER" )
kfRes@xyLineColor = "blue"
kf_outline( wks, plotB, kfRes, 2.5, 17, 1, 14, 8, 90, "Kelvin" )
; kfRes@xyLineColor = "cyan"
; kf_outline( wks, plotB, kfRes, 2.5, 5, -20, -6, mis, mis, "None" )
kfRes@xyLineColor = "blue"
kf_outline( wks, plotB, kfRes, 30, 96, 0, 9, mis, mis, "None" )
; kfRes@xyLineColor = "red"
; kf_outline( wks, plotB, kfRes, 2.5, 10, -10, -1, 8, 90, "MRG" )
kfRes@xyLineColor = "blue"
kf_outline( wks, plotB, kfRes, 05, 72, -10, -1, mis, 90, "ER" )
end if
; WK99-style
if( False ) then
kfRes = True
kfRes@xyLineColor = "palegreen"
kfRes@xyLineColor = "blue"
kfRes@xyLineThicknessF = 6
; kfRes@xyDashPattern = 16
kf_outline( wks, plotA, kfRes, 2.5, 30, 1, 14, 8, 90, "Kelvin" )
kf_outline( wks, plotA, kfRes, 30, 96, 1, 5, mis, mis, "None" )
kf_outline( wks, plotA, kfRes, 2.5, 10, -10, -1, 8, 90, "MRG" )
kf_outline( wks, plotA, kfRes, 2.5, 10, -18,-10, 90, mis, "MRG" )
kf_outline( wks, plotA, kfRes, 05, 48, -10, -1, 8, 90, "ER" )
kf_outline( wks, plotB, kfRes, 2.5, 30, 1, 14, 8, 90, "Kelvin" )
kf_outline( wks, plotB, kfRes, 30, 96, 1, 5, mis, mis, "None" )
kf_outline( wks, plotB, kfRes, 2.5, 10, -10, -1, 8, 90, "MRG" )
kf_outline( wks, plotB, kfRes, 2.5, 10, -18,-10, 90, mis, "MRG" )
kf_outline( wks, plotB, kfRes, 05, 48, -10, -1, 8, 90, "ER" )
end if
resTx@txFontHeightF = 0.020
; resTx@txFont = "helvetica-bold"
resTx@txPerimOn = True
resTx@txBackgroundFillColor = "background"
resTx@txPerimThicknessF = 0
resTx@txPerimSpaceF = 0.2
mjoLabA = gsn_add_text( wks, plotA, "MJO", 7, 0.05, resTx )
kelvinLabA = gsn_add_text( wks, plotA, "Kelvin", 9, 0.3, resTx )
mrgLabA = gsn_add_text( wks, plotA, "MRG", -4, 0.195, resTx )
; tdLabA = gsn_add_text( wks, plotA, "TD", -14, 0.30, resTx )
erLabA = gsn_add_text( wks, plotA, "ER", -7, 0.06, resTx )
mjoLabB = gsn_add_text( wks, plotB, "MJO", 7, 0.05, resTx )
kelvinLabB = gsn_add_text( wks, plotB, "Kelvin", 9, 0.3, resTx )
; mrgLabB = gsn_add_text( wks, plotB, "MRG", -4, 0.195, resTx )
tdLabB = gsn_add_text( wks, plotB, "TD", -14, 0.30, resTx )
erLabB = gsn_add_text( wks, plotB, "ER", -7, 0.06, resTx )
plotB = kf_draw( wks, symPower(freq|:,k|:), "None", True, False, res )
; Customize panel
panRes = True
panRes@gsnFrame = False
panRes@gsnPanelRight = 0.97
panRes@gsnPanelBottom = 0.05
panRes@gsnPanelYWhiteSpacePercent = 5
......@@ -346,9 +124,6 @@ begin ; main
gsn_panel( wks, (/ plotA, plotB /), (/ 1, 2 /), panRes )
; call frame
frame(wks)
print_clock( "Convert the image, if necessary" )
delete(wks)
if( isStrSubset( plotType, "png" ).or.isStrSubset( plotType, "gif" ) ) then
......
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; wk99_trend.ncl
; Carl Schreck (cjschrec@ncsu.edu)
; December 2014
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Description: Draw the difference in the spectra bewteen two periods
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/diagnostics_cam.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/time_axis_labels.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl"
load "$CJS_NCL_LIB/lib.cjs_graphics.ncl"
load "$CJS_NCL_LIB/print_clock.ncl"
load "sub.draw_wk99_trend.ncl"
begin ; main
print_clock( "Here we go!" )
; These are some parameters that could be useful to have up top
if(.not.isvar( "sensor" ) ) then
sensor = "hirs"
end if
plotType = "png"
plotName = "figures/wk99_trend." + sensor
plotDpi = 200
fontHeightF = 0.02
inPath = "/home/carl/data/olr/compare/" + sensor + "/olr.anom.nc"
obsPerDay = 1
outLineString = "None"
minLat = -15
maxLat = 15
print_clock( "Reading" )
inFile = addfile( inPath, "r" )
if( sensor.eq."claus" ) then
data = inFile->anom(:,{minLat:maxLat},:)
else
data = inFile->olr(:,{minLat:maxLat},:)
end if
; Customize base plot
res = True
res@cnFillPalette = "CBR_coldhot"
res@cnLevels = ispan( -5, 5, 1 ) * 0.1
res@cnLinesOn = False
res@cnFillMode = "CellFill"
print_clock( "Drawing the plot" )
; ...allows png or gif to work
if( isStrSubset( plotType, "png" ).or.isStrSubset( plotType, "gif" ) ) then
plotTypeLocal = "eps"
else
plotTypeLocal = plotType
end if
; ...open the workstation
wks = gsn_open_wks( plotTypeLocal, plotName )
res@gsnLeftString = "Anti-symmetric " + str_upper(sensor)
print_clock( res@gsnLeftString )
plotA = draw_wk99_trend( wks, data, obsPerDay, "anti", res )
res@gsnLeftString = "Symmetric " + str_upper(sensor)
print_clock( res@gsnLeftString )
plotB = draw_wk99_trend( wks, data, obsPerDay, "sym", res )
; Customize panel
panRes = True
panRes@gsnPanelRight = 0.97
panRes@gsnPanelBottom = 0.05
panRes@gsnPanelYWhiteSpacePercent = 5
panRes@txString = str_upper(sensor) + ": log(Total Spectra)"
panRes@gsnPanelLabelBar = True
panRes@lbTitlePosition = "Right"
panRes@lbTitleDirection = "Across"
panRes@lbOrientation = "Horizontal"
panRes@lbLabelAutoStride = True
panRes@lbTitleFontHeightF = fontHeightF * 0.8
panRes@lbLabelFontHeightF = fontHeightF * 0.8
panRes@pmLabelBarOrthogonalPosF = fontHeightF * 0
panRes@pmLabelBarHeightF = fontHeightF * 2
gsn_panel( wks, (/ plotA, plotB /), (/ 1, 2 /), panRes )
print_clock( "Convert the image, if necessary" )
delete(wks)
if( isStrSubset( plotType, "png" ).or.isStrSubset( plotType, "gif" ) ) then
system( "convert -trim -border 5x5 -bordercolor white " \
+ "+repage -density " + plotDpi + " " \\
+ plotName + ".eps " + plotName + "." + plotType )
if( .not.isStrSubset( plotType, "e" ) ) then
system( "rm -f " + plotName + ".eps" )
end if
end if
print_clock( "Thank you, come again." )
end; main
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment