Skip to content

Commit 723460b

Browse files
authored
Merge pull request #29 from terraref/radiometer
radiometer / envt logger example
2 parents 21f0399 + feddaab commit 723460b

1 file changed

Lines changed: 225 additions & 0 deletions

File tree

sensors/09-vnir-radiometer.Rmd

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
2+
# VNIR Radiometer Data
3+
4+
## Query from Environmental logger netCDF files
5+
6+
These are used in the hyperspectral workflow. Let's look at the sky:
7+
8+
```{r netcdf-met, eval=FALSE}
9+
library(ncdf4)
10+
library(udunits2)
11+
library(lubridate)
12+
13+
get_spectra <- function(date, site = 'ua-mac'){
14+
15+
16+
envlog_file <- file.path("/data/terraref/sites", site, "Level_1/envlog_netcdf", date,
17+
paste0("envlog_netcdf_L1_", site, "_", date, ".nc"))
18+
envlog.nc <- nc_open(envlog_file, readunlim = FALSE)
19+
timepoints <- ud.convert(4*1:5, 'h', '5s')
20+
21+
flx_spc_dwn <- ncvar_get(envlog.nc, 'flx_spc_dwn')[,timepoints]
22+
datetime <- ymd("1970-01-01", tz ="America/Phoenix") +
23+
seconds(ud.convert(ncvar_get(envlog.nc, 'time'), 'day', 's'))
24+
datetime[timepoints]
25+
26+
z <- as.data.frame(flx_spc_dwn)
27+
colnames(z) <- datetime[timepoints]
28+
29+
wvl <- ncvar_get(envlog.nc, 'wvl_lgr')
30+
wvl.idx <- sapply(c(34:81*10),
31+
function(x) which.min(abs(x-wvl)))
32+
zz <- z[wvl.idx,]
33+
rownames(zz) <- round(wvl[wvl.idx])
34+
return(t(zz))
35+
write(zz, file = paste0('tmp/',date, '.csv'))
36+
}
37+
38+
39+
dates <- seq(ymd('2017-04-15'), ymd('2017-11-12'), by = '10 days')
40+
all_spectra <- lapply(as.character(dates), get_spectra)
41+
spectra.df <- lapply(all_spectra, as.data.frame)
42+
zzz <- do.call(rbind, unname(spectra.df))
43+
write.csv(zzz, '~/tmp/spectra.csv')
44+
return(list(spc = spc, wvl = wvl, date = ymd(strftime(datetime, '%Y%m%d')), datetime = datetime))
45+
46+
47+
48+
for(date in c('2016-06-21', '2016-09-21', '2016-12-21', '2017-03-21', '2017-05-21')){
49+
50+
directory <- file.path("/data/terraref/sites/ua-mac/Level_1/envlog_netcdf/", date)
51+
files <- dir(directory, full.names = TRUE)
52+
spectra_list <- lapply(files, function(x){
53+
metnc <- nc_open(x)
54+
spc <- ncvar_get(metnc, 'flx_spc_dwn')
55+
datetime <- ymd("1970-01-01") +
56+
seconds(ud.convert(ncvar_get(metnc, 'time'), 'day', 's'))
57+
wvl <- ncvar_get(metnc, 'wvl_lgr')
58+
time <- hour(datetime) +
59+
minute(datetime)/60 +
60+
second(datetime)/3600
61+
return(list(spc = spc, wvl = wvl, date = ymd(strftime(datetime, '%Y%m%d')), datetime = datetime))
62+
63+
})
64+
65+
spectra_df <- do.call('cbind',(lapply(spectra_list, '[[', 'spc') ))
66+
dim(spectra_df)
67+
68+
time <- do.call('c',lapply(spectra_list,'[[','datetime'))
69+
wavelengths <- spectra_list[[1]]$wvl
70+
save(spectra_df, time, wavelengths, file = file.path('data', paste0("spectra",date,".Rdata")))
71+
idx <- 1+0:700*24
72+
i <- 1:length(hr)[!is.na(hr)]
73+
library(lubridate)
74+
hr <- hour(time) + minute(time)/60 + second(time)/3600
75+
png(filename = paste0('data/spectra',date,'.png'))
76+
image(x = wavelengths, y = as.numeric(hr[idx]), spectra_df[,idx],
77+
ylab = 'hour of day',
78+
xlab = 'wavelength (nm)',
79+
col = cm.colors(n=100),zlim = c(-1,2.1),
80+
main = paste0('diurnal solar spectral radiation\n',date))
81+
dev.off()
82+
83+
}
84+
library(lubridate)
85+
library(data.table)
86+
library(udunits2)
87+
88+
time <- ncvar_get(metnc, 'time')
89+
90+
wavelengths <- ncvar_get(metnc, 'wvl_lgr')
91+
92+
f_down_spectrum <- ncvar_get(metnc, 'flx_spc_dwn')
93+
94+
library(ggplot2)
95+
96+
ggplot() +
97+
geom_point(aes(wavelengths, f_down_spectrum[,1])) +
98+
geom_line(aes(wavelengths, f_down_spectrum[,1]))
99+
100+
f_down_means <- rowMeans(f_down_spectrum)
101+
102+
ggplot() +
103+
geom_point(aes(wavelengths, f_down_means)) +
104+
geom_line(aes(wavelengths, f_down_means))
105+
106+
print(metnc)
107+
108+
```
109+
110+
### Your turn:
111+
112+
Can you see the effect of the August 21, 2017 solar eclipse on the diurnal spectral radiance?
113+
114+
## Raw sensor data
115+
116+
Here we can found the original data written by the sensor. Unlike above, these are in text files and are not in a standard format like the CF format above.
117+
118+
```{r raw-met, cache=TRUE}
119+
metfile <- "/data/terraref/sites/ua-mac/raw_data/EnvironmentLogger/2017-05-31/2017-05-31_12-19-38_environmentlogger.json"
120+
met <- jsonlite::fromJSON(metfile)
121+
122+
timestamp <- lubridate::ymd_hms(met$environment_sensor_readings$timestamp)
123+
124+
wavelengths <- met$environment_sensor_readings$spectrometer$wavelength[[1]]
125+
126+
spectra <- do.call('rbind', met$environment_sensor_readings$spectrometer$spectrum)
127+
128+
library(dplyr)
129+
spectra <- do.call('rbind', met$environment_sensor_readings$spectrometer$spectrum)
130+
131+
#colnames(spectra) <- wavelengths
132+
#rownames(spectra) <- met$environment_sensor_readings$timestamp
133+
image(x = timestamp, y = wavelengths, z = spectra)
134+
```
135+
136+
137+
```{r}
138+
library(dplyr)
139+
library(readr)
140+
date = '2017-04-15'
141+
load_loggerdata <- function(date){
142+
path <- file.path("/data/terraref/sites/ua-mac/raw_data/EnvironmentLogger", date)
143+
files <- dir(path, full.names = TRUE)
144+
loggerdata <- lapply(files, jsonlite::fromJSON)
145+
timestamp <- combine(sapply(loggerdata, function(x){
146+
t <- x$environment_sensor_readings$timestamp
147+
lubridate::ymd_hms(t)
148+
}))
149+
return(list(data = loggerdata, timestamp = timestamp))
150+
}
151+
152+
extract_downwelling_irradiance <- function(logdata){
153+
154+
wavelengths <- logdata$data[[1]]$environment_sensor_readings$spectrometer$wavelength[[1]]
155+
156+
spectra <- do.call('rbind', lapply(logdata$data, function(x){
157+
do.call('rbind', x$environment_sensor_readings$spectrometer$spectrum)
158+
}
159+
))
160+
# image(x = timestamp, y = wavelengths, z = spectra)
161+
return(list(spectra = spectra, wavelengths = wavelengths, timestamp = logdata$timestamp))
162+
}
163+
164+
extract_logger_met <- function(logdata){
165+
166+
met <- do.call('rbind', lapply(logdata$data, function(x){
167+
tmp_met <- x$environment_sensor_readings
168+
data.frame(par = tmp_met$`sensor par`$value,
169+
co2 = tmp_met$`sensor co2`$value,
170+
sundir = tmp_met$weather_station$sunDirection$value,
171+
pressure = tmp_met$weather_station$airPressure$value,
172+
brightness = tmp_met$weather_station$brightness$value,
173+
rh = tmp_met$weather_station$relHumidity$value,
174+
temp = tmp_met$weather_station$temperature$value,
175+
wind_dir = tmp_met$weather_station$windDirection$value,
176+
wind_speed = tmp_met$weather_station$windVelocity$value)
177+
178+
}))
179+
return(met)
180+
}
181+
182+
env_log_data <- load_loggerdata(date = '2017-04-15')
183+
env_log_spectra <- extract_downwelling_irradiance(env_log_data)
184+
env_log_met <- extract_logger_met(env_log_data)
185+
186+
```
187+
188+
#### Plots
189+
190+
```{r}
191+
library(lubridate)
192+
library(dplyr)
193+
library(tidyr)
194+
time <- env_log_data$timestamp
195+
196+
hourly_index <- 1+0:23*720
197+
198+
time_hr <- time[hourly_index]
199+
hourly_spectra <- env_log_spectra$spectra[hourly_index,]
200+
wavelengths <- env_log_spectra$wavelengths
201+
202+
colnames(hourly_spectra) <- wavelengths
203+
204+
image(x = time_hr, y = wavelengths, z = hourly_spectra,
205+
xlab = 'local time', ylab = 'wavelength (nm)')
206+
```
207+
208+
```{r spectra-ggplot}
209+
210+
spectra_df <- data.frame(hour = 1:24, hourly_spectra)
211+
212+
spectra_long <- spectra_df %>%
213+
gather(key = wavelength, value = radiance, -hour) %>%
214+
mutate(wavelength = as.numeric(gsub("X", "", wavelength)))
215+
216+
colnames(spectra_long)
217+
218+
library(ggplot2)
219+
ggplot(data = spectra_long, aes(x = wavelength, y = radiance)) +
220+
geom_line(size = 0.1) +
221+
ggthemes::theme_tufte() +
222+
facet_wrap(~hour, ncol = 6) +
223+
ggtitle(paste('spectra on', date))
224+
225+
```

0 commit comments

Comments
 (0)