Project

General

Profile

Download (8.2 KB) Statistics
| Branch: | Revision:
1
###  Script to compile the monthly cloud data from earth engine into a netcdf file for further processing
2

    
3
library(raster)
4
library(doMC)
5
library(multicore)
6
library(foreach)
7
#library(doMPI)
8
registerDoMC(4)
9
#beginCluster(4)
10

    
11
wd="~/acrobates/adamw/projects/cloud"
12
setwd(wd)
13

    
14

    
15
##  Get list of available files
16
df=data.frame(path=list.files("/mnt/data2/projects/cloud/mod09",pattern="*.tif$",full=T,recur=T),stringsAsFactors=F)
17
df[,c("region","year","month")]=do.call(rbind,strsplit(basename(df$path),"_|[.]"))[,c(1,2,3)]
18
df$date=as.Date(paste(df$year,"_",df$month,"_15",sep=""),"%Y_%m_%d")
19

    
20
## add stats to test for missing data
21
addstats=F
22
if(addstats){
23
    df[,c("max","min","mean","sd")]=do.call(rbind.data.frame,mclapply(1:nrow(df),function(i) as.numeric(sub("^.*[=]","",grep("STATISTICS",system(paste("gdalinfo -stats",df$path[i]),inter=T),value=T)))))
24
    table(df$sd==0)
25
}
26

    
27
## subset to testtiles?
28
#df=df[df$region%in%testtiles,]
29
#df=df[df$month==1,]
30
table(df$year,df$month)
31

    
32
## drop some if not complete
33
#df=df[df$month%in%1:9&df$year%in%c(2001:2012),]
34
rerun=F  # set to true to recalculate all dates even if file already exists
35

    
36
## Loop over existing months to build composite netcdf files
37
foreach(date=unique(df$date)) %dopar% {
38
    ## get date
39
  print(date)
40
  ## Define output and check if it already exists
41
  vrtfile=paste(tempdir,"/mod09_",date,".vrt",sep="")
42
  ncfile=paste(tempdir,"/mod09_",date,".nc",sep="")
43
  tffile=paste(tempdir,"/mod09_",date,".tif",sep="")
44

    
45
  if(!rerun&file.exists(ncfile)) return(NA)
46
  ## merge regions to a new netcdf file
47
#  system(paste("gdal_merge.py -o ",tffile," -init -32768  -n -32768.000 -ot Int16 ",paste(df$path[df$date==date],collapse=" ")))
48
  system(paste("gdalbuildvrt -overwrite -srcnodata -32768 ",vrtfile," ",paste(df$path[df$date==date],collapse=" ")))
49
  ## Warp to WGS84 grid and convert to netcdf
50
  ops="-t_srs 'EPSG:4326' -multi -r cubic -te -90 -90 0 90 -tr 0.008333333333333 -0.008333333333333"
51
  ops="-t_srs 'EPSG:4326' -multi -r cubic -te -180 -90 180 90 -tr 0.008333333333333 -0.008333333333333"
52

    
53
  system(paste("gdalwarp -overwrite ",ops," -srcnodata -32768 -dstnodata -32768 -of netCDF ",vrtfile," ",ncfile," -ot Int16"))
54
#  system(paste("gdalwarp -overwrite ",ops," -srcnodata -32768 -dstnodata -32768 -of netCDF ",vrtfile," ",tffile," -ot Int16"))
55

    
56
  setwd(wd)
57
  system(paste("ncecat -O -u time ",ncfile," ",ncfile,sep=""))
58
## create temporary nc file with time information to append to MOD06 data
59
  cat(paste("
60
    netcdf time {
61
      dimensions:
62
        time = 1 ;
63
      variables:
64
        int time(time) ;
65
      time:units = \"days since 2000-01-01 00:00:00\" ;
66
      time:calendar = \"gregorian\";
67
      time:long_name = \"time of observation\"; 
68
    data:
69
      time=",as.integer(date-as.Date("2000-01-01")),";
70
    }"),file=paste(tempdir,"/",date,"_time.cdl",sep=""))
71
system(paste("ncgen -o ",tempdir,"/",date,"_time.nc ",tempdir,"/",date,"_time.cdl",sep=""))
72
system(paste("ncks -A ",tempdir,"/",date,"_time.nc ",ncfile,sep=""))
73
## add other attributes
74
  system(paste("ncrename -v Band1,CF ",ncfile,sep=""))
75
  system(paste("ncatted ",
76
               " -a units,CF,o,c,\"%\" ",
77
#               " -a valid_range,CF,o,b,\"0,100\" ",
78
               " -a scale_factor,CF,o,f,\"0.1\" ",
79
               " -a _FillValue,CF,o,f,\"-32768\" ",
80
               " -a long_name,CF,o,c,\"Cloud Frequency(%)\" ",
81
               " -a NETCDF_VARNAME,CF,o,c,\"Cloud Frequency(%)\" ",
82
               " -a title,global,o,c,\"Cloud Climatology from MOD09 Cloud Mask\" ",
83
               " -a institution,global,o,c,\"Jetz Lab, EEB, Yale University, New Haven, CT\" ",
84
               " -a source,global,o,c,\"Derived from MOD09GA Daily Data\" ",
85
               " -a comment,global,o,c,\"Developed by Adam M. Wilson (adam.wilson@yale.edu / http://adamwilson.us)\" ",
86
               ncfile,sep=""))
87

    
88
               ## add the fillvalue attribute back (without changing the actual values)
89
#system(paste("ncatted -a _FillValue,CF,o,b,-32768 ",ncfile,sep=""))
90

    
91
if(as.numeric(system(paste("cdo -s ntime ",ncfile),intern=T))<1) {
92
  print(paste(ncfile," has no time, deleting"))
93
  file.remove(ncfile)
94
}
95
  print(paste(basename(ncfile)," Finished"))
96

    
97

    
98
}
99

    
100

    
101
### merge all the tiles to a single global composite
102
#system(paste("ncdump -h ",list.files(tempdir,pattern="mod09.*.nc$",full=T)[10]))
103
system(paste("cdo -O  mergetime ",paste(list.files(tempdir,pattern="mod09.*.nc$",full=T),collapse=" ")," data/cloud_daily.nc"))
104

    
105
#  Overall mean
106
system(paste("cdo -O  -chname,CF,CF_annual -timmean data/cloud_daily.nc  data/cloud_mean.nc"))
107

    
108
### generate the monthly mean and sd
109
#system(paste("cdo -P 10 -O merge -ymonmean data/mod09.nc -chname,CF,CF_sd -ymonstd data/mod09.nc data/mod09_clim.nc"))
110
system(paste("cdo  -O -ymonmean data/cloud_daily.nc data/cloud_ymonmean.nc"))
111
system(paste("cdo  -O -chname,CF,CF_sd -ymonstd data/cloud_daily.nc data/cloud_ymonsd.nc"))
112

    
113
#if(!file.exists("data/mod09_metrics.nc")) {
114
#    system("cdo -chname,CF,CFmin -timmin data/mod09_clim_mean.nc data/mod09_min.nc")
115
#    system("cdo -chname,CF,CFmax -timmax data/mod09_clim_mean.nc data/mod09_max.nc")
116
#    system("cdo -chname,CF,CFsd -timstd data/mod09_clim_mean.nc data/mod09_std.nc")
117
#    system("cdo -f nc2 merge data/mod09_std.nc data/mod09_min.nc data/mod09_max.nc data/mod09_metrics.nc")
118
    system("cdo merge -chname,CF,CFmin -timmin data/cloud_clim_mean.nc -chname,CF,CFmax -timmax data/cloud_clim_mean.nc  -chname,CF,CFsd -timstd data/cloud_clim_mean.nc  data/cloud_metrics.nc")
119
#}
120

    
121

    
122

    
123

    
124

    
125

    
126

    
127
### Long term summaries
128
seasconc <- function(x,return.Pc=T,return.thetat=F) {
129
          #################################################################################################
130
          ## Precipitation Concentration function
131
          ## This function calculates Precipitation Concentration based on Markham's (1970) technique as described in Schulze (1997)
132
          ## South Africa Atlas of Agrohydology and Climatology - R E Schulze, M Maharaj, S D Lynch, B J Howe, and B Melvile-Thomson
133
          ## Pages 37-38
134
          #################################################################################################
135
          ## x is a vector of precipitation quantities - the mean for each factor in "months" will be taken,
136
          ## so it does not matter if the data are daily or monthly, as long as the "months" factor correctly
137
          ## identifies them into 12 monthly bins, collapse indicates whether the data are already summarized as monthly means.
138
          #################################################################################################
139
          theta=seq(30,360,30)*(pi/180)                                       # set up angles for each month & convert to radians
140
                  if(sum(is.na(x))==12) { return(cbind(Pc=NA,thetat=NA)) ; stop}
141
                  if(return.Pc) {
142
                              rt=sqrt(sum(x * cos(theta))^2 + sum(x * sin(theta))^2)    # the magnitude of the summation
143
                                        Pc=as.integer(round((rt/sum(x))*100))}
144
                  if(return.thetat){
145
                              s1=sum(x*sin(theta),na.rm=T); s2=sum(x*cos(theta),na.rm=T)
146
                                        if(s1>=0 & s2>=0)  {thetat=abs((180/pi)*(atan(sum(x*sin(theta),na.rm=T)/sum(x*cos(theta),na.rm=T))))}
147
                                        if(s1>0 & s2<0)  {thetat=180-abs((180/pi)*(atan(sum(x*sin(theta),na.rm=T)/sum(x*cos(theta),na.rm=T))))}
148
                                        if(s1<0 & s2<0)  {thetat=180+abs((180/pi)*(atan(sum(x*sin(theta),na.rm=T)/sum(x*cos(theta),na.rm=T))))}
149
                                        if(s1<0 & s2>0)  {thetat=360-abs((180/pi)*(atan(sum(x*sin(theta),na.rm=T)/sum(x*cos(theta),na.rm=T))))}
150
                             thetat=as.integer(round(thetat))
151
                            }
152
                  if(return.thetat&return.Pc) return(c(conc=Pc,theta=thetat))
153
                  if(return.Pc)          return(Pc)
154
                  if(return.thetat)  return(thetat)
155
        }
156

    
157

    
158

    
159
## read in monthly dataset
160
mod09=brick("data/mod09_clim_mean.nc",varname="CF")
161
plot(mod09[1])
162

    
163
mod09_seas=calc(mod09,seasconc,return.Pc=T,return.thetat=F,overwrite=T,filename="data/mod09_seas.nc",NAflag=255,datatype="INT1U")
164
mod09_seas2=calc(mod09,seasconc,return.Pc=F,return.thetat=T,overwrite=T,filename="data/mod09_seas_theta.nc",datatype="INT1U")
165

    
166
plot(mod09_seas)
(47-47/51)