diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..1020e31 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,115 @@ + + +
+ + + + +Version 2.0, January 2004 <http://www.apache.org/licenses/>
+“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.
+“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”
+“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+END OF TERMS AND CONDITIONS
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets []
replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
vignettes/tarcking_seviri_brightness_temp.Rmd
+ tarcking_seviri_brightness_temp.Rmd
The purpose of this article is to show how to read in data that harp +cannot natively deal with. In this case we will read in SEVIRI +brightness temperature data from a NetCDF file that lacks information +about the domain.
+ +The data are stored as example data with the harpTobac
+package and can be accessed via the system.file()
+function.
+file_name <- system.file(
+ "example_data/Spain_202205_SEVIRI_bt_all.nc",
+ package = "harpTobac"
+)
+nc <- nc_open(file_name)
Longitude and latitude are stored as 2d arrays, so let’s read them in +and then close the connection to the NetCDF file.
+ +Now we need to establish the grid resolution. We can establish if the +data are on a regular grid, by checking if the mean difference between +each value is the same as the maximum.
+
+identical(apply(diff(lon), 1, mean), apply(diff(lon), 1, max))
+#> [1] TRUE
+identical(apply(diff(t(lat)), 1, mean), apply(diff(t(lat)), 1, max))
+#> [1] TRUE
Now that we have established that the data are on a regular grid, we +can extract the horizontal resolution.
+ +Finally we need the centre point of the domain in order to properly +define the domain.
+ +Now we can define the domain.
+
+dom <- define_domain(
+ centre_lon = centre_lon,
+ centre_lat = centre_lat,
+ nxny = dim(lon),
+ dxdy = c(dx, dy),
+ proj = "longlat"
+)
+
+plot(dom)
We also need to get the time data from the file. These are stored in +hours since the first date-time, but we want the data to be the actual +date times. harpIO has a, currently non exported function, that +can read the time data and convert them in date-times in UTC.
+
+valid_dttm <- unixtime_to_dttm(
+ harpIO:::get_time_nc(file_name, harpIO::netcdf_opts())$validdate
+)
The brightness temperature is stored in degrees C, which we will
+convert to Kelvin. We will read in one time at a time and use the domain
+e have just defined to put the data into a geofield, and subsequently a
+geolist. We will do this with the help of lapply()
and put
+the data in a tibble (just a data frame with a nicer print method).
+library(tibble)
+nc <- nc_open(file_name)
+bt <- tibble(
+ valid_dttm = valid_dttm,
+ brightness_temp = geolist(
+ lapply(
+ seq_along(valid_dttm),
+ function(i) geofield(
+ ncvar_get(nc, "bt", start = c(1, 1, i), count = c(-1, -1, 1)) + 273.15,
+ domain = dom
+ )
+ )
+ )
+)
+nc_close(nc)
Finally the harpTobac functions require the data to be of
+class harp_df
and we can easily do that conversion with
+as_harp_df()
+bt <- as_harp_df(bt)
We will detect features using minimum brightness temperature +thresholds of 250, 240, 230 and 220 K.
+
+features <- detect_features_multithreshold(
+ bt,
+ thresholds = seq(250, 220, -10),
+ data_col = brightness_temp,
+ target = "min",
+ n_min_threshold = 16,
+ position_threshold = "weighted_diff"
+)
And plot the feature locations at each time.
+
+countries <- get_map(get_domain(bt$brightness_temp), polygon = FALSE)
+ggplot(features, aes(longitude, latitude)) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ geom_point(aes(colour = factor(threshold_value))) +
+ facet_wrap(~timestr) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map() +
+ labs(colour = bquote(atop(Brightness~Temp, Threshold~"["*K*"]")))
We will segment the data using a threshold of 250K.
+
+library(zeallot)
+c(segments, features) %<-% segment_2d(
+ features,
+ bt,
+ threshold = 250,
+ data_col = brightness_temp,
+ target = "min"
+)
And plot with the brightness temperature for some selected times.
+
+ggplot() +
+ geom_georaster(
+ aes(geofield = brightness_temp), bt[13:16, ],
+ upscale_factor = 4, upscale_method = "downsample"
+ ) +
+ geom_geocontour(
+ aes(geofield = segmentation_mask), segments[13:16, ],
+ colour = "red"
+ ) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ facet_wrap(~valid_dttm) +
+ scale_fill_viridis_c(direction = -1) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
Now we can compute the cell tracks.
+
+tracks <- link_tracks(
+ features,
+ bt,
+ data_col = brightness_temp,
+ v_max = 20,
+ stubs = 2,
+ subnetwork_size = 100,
+ adaptive_step = 0.95,
+ adaptive_stop = 0.2
+)
And plot them, separately for each feature threshold.
+
+countries <- get_map(get_domain(bt$brightness_temp))
+ggplot(filter(tracks, cell > -1), aes(x, y)) +
+ geom_polygon(aes(group = group), countries, fill = "grey", colour = "grey30") +
+ geom_path(
+ aes(group = factor(cell), colour = factor(threshold_value)),
+ arrow = arrow(type = "open", angle = 30, length = unit(0.1, "cm"))
+ ) +
+ facet_wrap(~paste0("Brightness temp >= ", threshold_value, "K")) +
+ labs(colour = bquote(atop(OLR~threshold, "["*W.m^{-2}*"]"))) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
In this article, we show an example of tracking features in an +outgoing longwave radiation field from the NWP model MEPS. We are going +to make use of the harpIO package to load the data and the +ggplot2 package, together with some expansions from the +harpVis package to plot the data.
+ +First we need to load the data using read_forecast()
+from the harpIO package. The data are downloaded from the open
+data Thredds server at the Norwegian Meteorological Institute.
There are a few steps we need to go through to ensure we read the
+data properly. First we’ll add the outgoing longwave parameter to the
+parameter definitions so that read_forecast()
knows what
+parameter to extract. The data are also negative for outgoing radiation
+so we multiply by -1
+my_params <- add_param_def(
+ "olr",
+ netcdf = new_netcdf_param("toa_outgoing_longwave_flux"),
+ func = function(x) x * -1
+)
Then we set the path and template for the file(s) to read, as well as +some information about the netcdf files.
+
+url <- "https://thredds.met.no/thredds/dodsC/meps25epsarchive"
+template <- "{YYYY}/{MM}/{DD}/{fcst_model}_sfc_{YYYY}{MM}{DD}T{HH}Z.ncml"
+file_opts <- netcdf_opts(
+ z_var = "top_of_atmosphere", ref_time_var = "forecast_reference_time"
+)
And now we can read the data…
+
+olr <- read_forecast(
+ dttm = 2024052700,
+ fcst_model = "meps_det",
+ parameter = "olr",
+ lead_time = seq(0, 23),
+ file_path = url,
+ file_template = template,
+ file_format = "netcdf",
+ file_format_opts = file_opts,
+ param_defs = my_params,
+ return_data = TRUE
+)
+#> Reading https://thredds.met.no/thredds/dodsC/meps25epsarchive/2024/05/27/meps_det_sfc_20240527T00Z.ncml
Feature detection is done using thresholds to identify contiguous +features in the field of interest at each time. This requires careful +selection of thresholds, so as a first step we will plot the OLR at each +time step.
+
+countries <- get_map(get_domain(olr$fcst), polygon = FALSE)
+ggplot() +
+ geom_georaster(
+ aes(geofield = fcst), olr,
+ upscale_factor = 8, upscale_method = "downsample"
+ ) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ facet_wrap(~valid_dttm) +
+ scale_fill_viridis_c(bquote(OLR~"["*W.m^{-2}*"]"), direction = -1) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
It looks like most of the interesting features are for OLR < ~180. +We can get a better idea by masking all values that are > 180, by +adding limits to the colour scale.
+
+countries <- get_map(get_domain(olr$fcst), polygon = FALSE)
+ggplot() +
+ geom_georaster(
+ aes(geofield = fcst), olr,
+ upscale_factor = 8, upscale_method = "downsample"
+ ) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ facet_wrap(~valid_dttm) +
+ scale_fill_viridis_c(
+ bquote(OLR~"["*W.m^{-2}*"]"), direction = -1,
+ limits = c(NA, 180), na.value = "white"
+ ) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
Using this information we will use thresholds of 180, 160 and 140 in
+the feature detection, setting the target to “min” since we want
+features to be identified that are less than the thresholds. Features
+are detected using detect_features_multithreshold()
that is
+a wrapper around tobac.feature_detection.feature_detection_multithreshold
+from the original Python package. We will only detect features that are
+at least 16 contiguous pixels in size, and use the “weighted_diff”
+method to set the position of the features.
+features <- detect_features_multithreshold(
+ olr,
+ thresholds = c(180, 160, 140),
+ data_col = fcst,
+ target = "min",
+ n_min_threshold = 16,
+ position_threshold = "weighted_diff"
+)
We can now plot the feature locations for each threshold and +time.
+
+ggplot(features, aes(projection_x_coordinate, projection_y_coordinate)) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ geom_point(aes(colour = factor(threshold_value))) +
+ facet_wrap(~timestr) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map() +
+ labs(colour = bquote(atop(OLR~Threshold,"["*W.m^{-2}*"]")))
Having run the feature detection, the next step is to associate
+regions with the identified features. This is done using
+segment_2d()
that is a wrapper around the tobac.segmentation.segmentation_2D
+function from the original Python package. Here a single threshold is
+needed, and we use the highest of the thresholds we used in the feature
+detection. segment_2d
returns a named list, but we can
+destructure using the %<-%
operator from the
+zeallot package.
+library(zeallot)
+c(segments, features) %<-% segment_2d(
+ features,
+ olr,
+ threshold = 180,
+ data_col = fcst,
+ target = "min"
+)
segments
is a data frame with a geolist coloumn
+that contains fields with a mask identifying the areas that are
+associated with each feature, while features
is the same as
+the output of the previous step, but with an extra column giving the
+number of cells associated with each feature. The segment masks can be
+overlayed on top of the original OLR data. Here we just show 4
+times.
+ggplot() +
+ geom_georaster(
+ aes(geofield = fcst), olr[11:14, ],
+ upscale_factor = 4, upscale_method = "downsample"
+ ) +
+ geom_geocontour(
+ aes(geofield = segmentation_mask), segments[11:14, ],
+ colour = "red"
+ ) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ facet_wrap(~valid_dttm) +
+ scale_fill_viridis_c(direction = -1) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
With the features identified, the tracking algorithm attempts to link
+these features in time to produce tracks. The tracking is computed with
+the link_tracks()
function that is a wrapper around tobac.tracking.linking_trackpy
+from the original Python package.
+tracks <- link_tracks(
+ features,
+ olr,
+ data_col = fcst,
+ v_max = 20,
+ stubs = 2,
+ subnetwork_size = 100,
+ adaptive_step = 0.95,
+ adaptive_stop = 0.2
+)
Some of the arguments in the call to link_tracks()
+require some experimentation, and are better explained in some of the tobac
+examples.
The tracks for each of the identified cells can easily be plotted. +For all tracks throughout the period this can be done making sure to +remove untracked cells (these are labelled -1).
+
+library(dplyr)
+countries <- get_map(get_domain(olr$fcst))
+ggplot(filter(tracks, cell > -1), aes(x, y)) +
+ geom_polygon(aes(group = group), countries, fill = "grey", colour = "grey30") +
+ geom_path(
+ aes(group = factor(cell), colour = factor(threshold_value)),
+ arrow = arrow(type = "open", angle = 30, length = unit(0.1, "cm"))
+ ) +
+ labs(colour = bquote(atop(OLR~threshold, "["*W.m^{-2}*"]"))) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
We could then plot some statistics, such as the distribution of the +lifetimes of individual cells.
+ + +vignettes/tracking_seviri_brightness_temp.Rmd
+ tracking_seviri_brightness_temp.Rmd
The purpose of this article is to show how to read in data that harp +cannot natively deal with. In this case we will read in SEVIRI +brightness temperature data from a NetCDF file that lacks information +about the domain.
+ +The data are stored as example data with the harpTobac
+package and can be accessed via the system.file()
+function.
+file_name <- system.file(
+ "example_data/Spain_202205_SEVIRI_bt_all.nc",
+ package = "harpTobac"
+)
+nc <- nc_open(file_name)
Longitude and latitude are stored as 2d arrays, so let’s read them in +and then close the connection to the NetCDF file.
+ +Now we need to establish the grid resolution. We can establish if the +data are on a regular grid, by checking if the mean difference between +each value is the same as the maximum.
+
+identical(apply(diff(lon), 1, mean), apply(diff(lon), 1, max))
+#> [1] TRUE
+identical(apply(diff(t(lat)), 1, mean), apply(diff(t(lat)), 1, max))
+#> [1] TRUE
Now that we have established that the data are on a regular grid, we +can extract the horizontal resolution.
+ +Finally we need the centre point of the domain in order to properly +define the domain.
+ +Now we can define the domain.
+
+dom <- define_domain(
+ centre_lon = centre_lon,
+ centre_lat = centre_lat,
+ nxny = dim(lon),
+ dxdy = c(dx, dy),
+ proj = "longlat"
+)
+
+plot(dom)
We also need to get the time data from the file. These are stored in +hours since the first date-time, but we want the data to be the actual +date times. harpIO has a, currently non exported function, that +can read the time data and convert them in date-times in UTC.
+
+valid_dttm <- unixtime_to_dttm(
+ harpIO:::get_time_nc(file_name, harpIO::netcdf_opts())$validdate
+)
The brightness temperature is stored in degrees C, which we will
+convert to Kelvin. We will read in one time at a time and use the domain
+e have just defined to put the data into a geofield, and subsequently a
+geolist. We will do this with the help of lapply()
and put
+the data in a tibble (just a data frame with a nicer print method).
+library(tibble)
+nc <- nc_open(file_name)
+bt <- tibble(
+ valid_dttm = valid_dttm,
+ brightness_temp = geolist(
+ lapply(
+ seq_along(valid_dttm),
+ function(i) geofield(
+ ncvar_get(nc, "bt", start = c(1, 1, i), count = c(-1, -1, 1)) + 273.15,
+ domain = dom
+ )
+ )
+ )
+)
+nc_close(nc)
Finally the harpTobac functions require the data to be of
+class harp_df
and we can easily do that conversion with
+as_harp_df()
+bt <- as_harp_df(bt)
We will detect features using minimum brightness temperature +thresholds of 250, 240, 230 and 220 K.
+
+features <- detect_features_multithreshold(
+ bt,
+ thresholds = seq(250, 220, -10),
+ data_col = brightness_temp,
+ target = "min",
+ n_min_threshold = 16,
+ position_threshold = "weighted_diff"
+)
And plot the feature locations at each time.
+
+countries <- get_map(get_domain(bt$brightness_temp), polygon = FALSE)
+ggplot(features, aes(longitude, latitude)) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ geom_point(aes(colour = factor(threshold_value))) +
+ facet_wrap(~timestr) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map() +
+ labs(colour = bquote(atop(Brightness~Temp, Threshold~"["*K*"]")))
We will segment the data using a threshold of 250K.
+
+library(zeallot)
+c(segments, features) %<-% segment_2d(
+ features,
+ bt,
+ threshold = 250,
+ data_col = brightness_temp,
+ target = "min"
+)
And plot with the brightness temperature for some selected times.
+
+ggplot() +
+ geom_georaster(
+ aes(geofield = brightness_temp), bt[13:16, ],
+ upscale_factor = 4, upscale_method = "downsample"
+ ) +
+ geom_geocontour(
+ aes(geofield = segmentation_mask), segments[13:16, ],
+ colour = "red"
+ ) +
+ geom_path(aes(x, y), countries, colour = "grey30") +
+ facet_wrap(~valid_dttm) +
+ scale_fill_viridis_c(direction = -1) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
Now we can compute the cell tracks.
+
+tracks <- link_tracks(
+ features,
+ bt,
+ data_col = brightness_temp,
+ v_max = 20,
+ stubs = 2,
+ subnetwork_size = 100,
+ adaptive_step = 0.95,
+ adaptive_stop = 0.2
+)
And plot them, separately for each feature threshold.
+
+countries <- get_map(get_domain(bt$brightness_temp))
+ggplot(filter(tracks, cell > -1), aes(x, y)) +
+ geom_polygon(aes(group = group), countries, fill = "grey", colour = "grey30") +
+ geom_path(
+ aes(group = factor(cell), colour = factor(threshold_value)),
+ arrow = arrow(type = "open", angle = 30, length = unit(0.1, "cm"))
+ ) +
+ facet_wrap(~paste0("Brightness temp >= ", threshold_value, "K")) +
+ labs(colour = bquote(atop(OLR~threshold, "["*W.m^{-2}*"]"))) +
+ coord_equal(expand = FALSE) +
+ theme_harp_map()
harpTobac is a an interface to the Python package, tobac, for tracking and object based analysis of clouds.
+It currently enables you to pass harp_grid_df
data frames to do a basic analysis and tracking of 2d fields. That is, feature detection in 2d, segmentation in 2d and 2d linking of features into tracks.
Currently no specific functions for visualisation have been written, but the outputs are basic data frames and harp_grid_df
data frames that can be easily visualised using ggplot2 and harpVis geoms.
You can install harpTobac from Github like so:
+
+if (!requireNamespace("remotes")) {
+ install.packages("remotes")
+}
+remotes::install_github("harphub/harpTobac")
Once you have installed harpTobac you will need to install the tobac Python package. This is done using the install_tobac()
function. The necessary packages will be installed into a virtualenv called “harp-py”. This is where all Python packages that can be used by harp are installed and run from. If you already have a “harp-py” virtualenv you will be asked if you want to remove it prior to installation. Typically you will answer no to this, otherwise all of your harp Python packages will be removed.
You will only need to do the above once, straight after installing harpTobac. Subsequently, when the harpTobac package is attached your session will use the “harp-py” virtualenv.
+feature_detection_multithreshold()
functionR/bindings.R
+ detect_features_multithreshold.Rd
This function is used to detect features on a field based on contiguous
+regions. The regions are above / below a threshold depending on the value of
+the target
argument. Note that 3d features are not yet implemented for this
+wrapper.
detect_features_multithreshold(
+ field_data,
+ thresholds,
+ data_col = "gridded_data",
+ dttm_col = "valid_dttm",
+ target = c("max", "min"),
+ position_threshold = c("centre", "extreme", "weighted_diff", "weighted_abs"),
+ sigma_threshold = 0.5,
+ n_erosion_threshold = 0,
+ n_min_threshold = 0,
+ min_distance = 0,
+ feature_number_start = 1,
+ pbc_flag = c("none", "h_dim1", "h_dim2", "both"),
+ vertical_coord = NULL,
+ vertical_axis = NULL,
+ detect_subset = NULL,
+ wavelength_filtering = NULL,
+ dz = NULL,
+ strict_thresholding = FALSE
+)
A harp_grid_df
data frame such as one returned by the
+harpIO functions
+harpIO::read_grid()
with data_frame = TRUE
, harpIO::read_forecast()
,
+or harpIO::read_analysis()
.
Threshold values used to select target regions to track.
+The feature detection is inclusive of the threshold value(s), i.e. values
+greater/less than or equal are included in the target region. The target
+argument controls whether the detection is based on less than or greater
+than the threshold(s).
<tidy-select
> The column in
+field_data
containing the fields to be used to detect features in. Should
+be a <geolist>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <geolist>
column, that <geolist>
column is
+used.
<tidy-select
> The column in
+field_data
containing the date-times to be used for the time dimension.
+Can be numeric with units in Unix time (seconds since 1970-01-01 00:00:00),
+or a <POSIXt>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <POSIXt>
column, that <POSIXt>
column is
+used.
Flag to determine if tracking is targeting minima or maxima in +the data. Should be "max" or "min". Default is "max".
Flag to choose the method to be used for the +setting the position of the tracked feature. Can be one of "centre", +"extreme", or "weighted_diff". Default is ‘centre’, though "weighted_diff" +is often preferable for atmospheric features.
Standard deviation for initial filtering step. Default +is 0.5.
Number of pixels by which to erode the identified +features. Default is 0.
Minimum number of identified contiguous pixels for a +feature to be detected. Default is 0.
Minimum distance between detected features (in metres). +Default is 0.
Feature id to start with. Default is 1.
Sets whether to use periodic boundaries, and if so in which +directions. "none" means that we do not have periodic boundaries "hdim_1" +means that we are periodic along hdim1, "hdim_2" means that we are periodic +along hdim2 and "both" means that we are periodic along both horizontal +dimensions
Name of the vertical coordinate. If NULL
, tries to
+auto-detect. It looks for the coordinate or the dimension name
+corresponding to the string.
The vertical axis number of the data. If NULL
, uses
+vertical_coord
to determine axis. This must be >=0.
Whether to run feature detection on only a subset of the
+data. If this is not NULL
, it should be a named list and it will subset
+the grid that we run feature detection on to the range specified for each
+axis specified. The format of this list is: list(axis-number = c(start, end))
, where axis-number is the number of the axis to subset, start is
+inclusive, and end is exclusive. For example, if your data are oriented as
+(time, z, y, x) and you want to only detect on values between z levels 10
+and 29, you would set: list("1" = c(10, 30))
. Note that this is not
+tested.
Minimum and maximum wavelength for horizontal
+spectral filtering in metres as a 2 element vector. Default is NULL
.
Constant vertical grid spacing (metres). If not specified and
+the input is 3D, this function requires that altitude is available in the
+features input. If you specify a value here, this function assumes that it
+is the constant z spacing between points, even if z_coordinate_name
is
+specified.
If TRUE
, a feature can only be detected if all
+previous thresholds have been met. Default is FALSE
.
A data frame of detected features.
+
+ All functions+ + |
+ |
---|---|
+ + | +harp wrapper for the tobac |
+
+ + | +Install Tobac |
+
+ + | +harp wrapper to the tobac function |
+
+ + | +harp wrapper for tobac |
+
+ + | +Main tobac module |
+
install_tobac()
installs the Python modules needed to run Tobac functions.
+The packages are installed in a virtualenv, which by default is named
+"harp-py". This virtual environment is the default virtual environment in
+which all harp related Python modules are installed. If you already have the
+"harp-py" virtualenv, you will be asked if you want to remove the virtualenv
+prior to installation. Typically you would answer no to this.
install_tobac(envname = "harp-py", new_env = identical(envname, "harp-py"))
The virtual environment into which to install the tobac Python +modules. Default is "harp-py".
Whether to start from a new environment by removing the
+envname
if it already exists. The defulat is TRUE if envname
already
+exists, and you will be prompted if you want to remove the virtualenv
+envname
.
tracking.linking_trackpy()
.R/bindings.R
+ link_tracks.Rd
harp wrapper to the tobac function tracking.linking_trackpy()
.
link_tracks(
+ features,
+ field_data,
+ dz = NULL,
+ data_col = "gridded_data",
+ dttm_col = "valid_dttm",
+ d_max = NULL,
+ subnetwork_size = NULL,
+ v_max = NULL,
+ memory = 0,
+ stubs = 1,
+ time_cell_min = NULL,
+ order = 1,
+ extrapolate = 0,
+ method_linking = c("predict", "random"),
+ adaptive_step = NULL,
+ adaptive_stop = NULL,
+ cell_number_start = 1,
+ cell_number_unassigned = -1,
+ vertical_coord = NULL,
+ min_h1 = NULL,
+ max_h1 = NULL,
+ min_h2 = NULL,
+ max_h2 = NULL,
+ pbc_flag = c("none", "hdim_1", "hdim_2", "both")
+)
A features data frame as returned by
+detect_features_multithreshold()
or
+segment_2d()
A harp_grid_df
data frame such as one returned by the
+harpIO functions
+harpIO::read_grid()
with data_frame = TRUE
, harpIO::read_forecast()
,
+or harpIO::read_analysis()
.
Constant vertical grid spacing (meters), optional. If not specified
+and the input is 3D, this function requires that vertical_coord is
+available in the features input. If you specify a value here, this function
+assumes that it is the constant z spacing between points, even if
+vertical_coord
is specified.
<tidy-select
> The column in
+field_data
containing the fields to be used to detect features in. Should
+be a <geolist>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <geolist>
column, that <geolist>
column is
+used.
<tidy-select
> The column in
+field_data
containing the date-times to be used for the time dimension.
+Can be numeric with units in Unix time (seconds since 1970-01-01 00:00:00),
+or a <POSIXt>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <POSIXt>
column, that <POSIXt>
column is
+used.
Maximum search range in metres. Only one of d_max, or v_max can
+be set. Default is NULL
.
Maximum size of subnetwork for linking. This parameter
+should be adjusted when using adaptive search. Usually a lower value is
+desired in that case. For a more in depth explanation have look
+here.
+If NULL
, 30 is used for regular search and 15 for adaptive search.
+Default is NULL
.
Speed at which features are allowed to move in m/s. Only one of
+d_max or v_max can be set. Default is NULL
.
Number of output timesteps features allowed to vanish for to +still be considered tracked. Default is 0. Warning :: This parameter +should be used with caution, as it can lead to erroneous trajectory +linking, espacially for data with low time resolution.
Minimum number of timesteps of a tracked cell to be reported. +Default is 1
Minimum length in time that a cell must be tracked for
+to be considered a valid cell in seconds. Default is NULL
.
Order of polynomial used to extrapolate trajectory into gaps and +on start and end point. Default is 1.
Number or timesteps to extrapolate trajectories. +Currently unused. Default is 0.
Flag choosing method used for trajectory linking. Can +be "predict" or "random". Default is ‘predict’. Note: the default in +tobac is "random" though they typically encourage users to use ‘predict’.
Reduce search range by multiplying it by this factor.
+Needs to be used in combination with adaptive_stop
. Default is NULL
.
If not NULL, when encountering an oversize subnet, retry by progressively reducing
search_rangeby multiplying with
adaptive_stepuntil the subnet is solvable. If search_range becomes <=
adaptive_stop, give up and raise a SubnetOversizeException. Needs to be used in combination with
adaptive_step. Default is
NULL`.
Cell number for first tracked cell. Default is 1.
Number to set the unassigned/non-tracked cells +to. Default is -1.
Name of the vertical coordinate. The vertical
+coordinate used must be metres. If NULL, it tries to auto-detect. It looks for the coordinate or the dimension name corresponding to the string. To use
dz, set this to
NULL`.
Minimum hdim_1 value, required when pbc_flag
is "hdim_1" or
+"both".
Maximum hdim_1 value, required when pbc_flag
is "hdim_1" or
+"both".
Minimum hdim_2 value, required when pbc_flag
is "hdim_2" or
+"both".
Maximum hdim_2 value, required when pbc_flag
is "hdim_2" or
+"both".
Sets whether to use periodic boundaries, and if so in which +directions. "none" means that we do not have periodic boundaries "hdim_1" +means that we are periodic along hdim1, "hdim_2" means that we are periodic +along hdim2 and "both" means that we are periodic along both horizontal +dimensions
Data frame of the linked features, containing the column "cell", with +integers indicating the affiliation of a feature to a specific track, and +the variable "time_cell" with the time, in seconds' the cell has already +existed.
+segmentation.segmentation_2d()
functionR/bindings.R
+ segment_2d.Rd
harp wrapper for tobac segmentation.segmentation_2d()
function
segment_2d(
+ features,
+ field_data,
+ threshold,
+ data_col = "gridded_data",
+ dttm_col = "valid_dttm",
+ target = c("max", "min"),
+ level = NULL,
+ method = "watershed",
+ max_distance = NULL,
+ pbc_flag = c("none", "h_dim1", "h_dim2", "both"),
+ seed_3d_flag = c("column", "box"),
+ statistic = NULL
+)
A features data frame, as returned by
+detect_features_multithreshold()
.
A harp_grid_df
data frame such as one returned by the
+harpIO functions
+harpIO::read_grid()
with data_frame = TRUE
, harpIO::read_forecast()
,
+or harpIO::read_analysis()
.
Threshold for the watershedding field to be used for the +mask.
<tidy-select
> The column in
+field_data
containing the fields to be used to detect features in. Should
+be a <geolist>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <geolist>
column, that <geolist>
column is
+used.
<tidy-select
> The column in
+field_data
containing the date-times to be used for the time dimension.
+Can be numeric with units in Unix time (seconds since 1970-01-01 00:00:00),
+or a <POSIXt>
column. If the named column is not found in field_data
,
+but field_data
contains 1 <POSIXt>
column, that <POSIXt>
column is
+used.
Flag to determine if tracking is targeting minima or maxima in +the data. Should be "max" or "min". Default is "max".
Levels at which to seed the cells for the watershedding
+algorithm. Default is NULL
.
Flag determining the algorithm to use (currently only +"watershed" is implemented).
Maximum distance from a marker allowed to be classified
+as belonging to that cell in metres. Default is NULL
.
Sets whether to use periodic boundaries, and if so in which +directions. "none" means that we do not have periodic boundaries "hdim_1" +means that we are periodic along hdim1, "hdim_2" means that we are periodic +along hdim2 and "both" means that we are periodic along both horizontal +dimensions
Seed 3D field at feature positions with either the full +column (default) or a box of user-set size.
Default is NULL
. Parameter to calculate bulk statistics
+within feature detection. Named list with callable function(s) to apply
+over the region of each detected feature and the name of the statistics to
+appear in the feature output data frame. The functions should be the values
+and the names of the metric the keys (e.g. list(mean = np.mean)). This
+probably doesn't work yet as there needs to be a translation between R and
+Python functions here.
A named list with:
segments: A data frame with a geolist
column with 2d fields on the
+same domain as the input data with integer values denoting each segment.
features: Feature data frame including the number of cells in the +segmented area of the feature at the time step.
Interface to main Tobac module. Provides access to top level functions as
+well as sub-modules using $
instead of .
as in Python.
toabc
Tobac module
+if (FALSE) {
+library(tobac)
+
+tobac$sys$api_version
+}
+
+