Code Monkey home page Code Monkey logo

ascotracer's Introduction

README

tic Project Status: Active – The project has reached a stable, usable state and is being actively developed. DOI

ascotraceR: An R package resource to simulate the spatiotemporal spread of Ascochyta blight in a chickpea field over a growing season

The goal of of ascotraceR is to develop a weather driven model to simulate the spread of Ascochyta blight disease in a chickpea field over a growing season.

This model is adapted from a model developed by (Diggle et al. 2002) for simulating the spread of anthracnose in a lupin field. The model is run using local weather data. The ascotraceR model simulates the pathogen related processes of conidial production, dispersal, successful deposition and infection on chickpea plants. Host related processes of growth are simulated in terms of development of growing points. The model divides the paddock into 1 square metre cells (observation quadrats/units) and simulates chickpea growth and A. rabiei activities in each cell. Initially, there is one growing point per sown seed when seed are sown. Chickpea growth is then described in terms of increase in the number of growing points. Conidia are dispersed from infested stubble by rain splash or wind driven rain when rainfall threshold is reached. Rainfall threshold refers to the minimum amount of rainfall required to disperse conidia from pycnidia and to provide sufficient duration of moisture for conidia to germinate and penetrate into the host tissues. After penetrating host tissues, conidia produce infected growing points. Infected growing points become sporulating lesions after completion of a latent period. The length of the latent period is a function of temperature, and the number of conidia produced per sporulating growing point depends on the level of resistance of the chickpea cultivar. As the model runs, it keeps a continuous track of non-infected, latent, infected and sporulating growing points (lesions). The ascotraceR’s minimum input requirements are location specific weather data and a list of input variables.

Quick start

ascotraceR is available on CRAN. To install the latest release, just run

install.packages("ascotraceR")

Alternatively, you may install the development version from GitHub this way.

if (!require("remotes"))
  install.packages("remotes")
remotes::install_github("IhsanKhaliq/ascotraceR",
                        build_vignettes = TRUE
)

Once installed you can simulate disease spread in a chickpea paddock.

Load the library.

library("ascotraceR")
library("data.table")
library("lubridate")

set.seed(3)

Import the weather data.

# weather data
Billa_Billa <- fread(
  system.file(
    "extdata",
    "2020_Billa_Billa_weather_data_ozforecast.csv",
    package = "ascotraceR"
  )
)

# format time column
Billa_Billa[, local_time := dmy_hm(local_time)]

# specify the station coordinates of the Billa Billa weather station
Billa_Billa[, c("lat", "lon") := .(-28.1011505, 150.3307084)]

head(Billa_Billa)
##    day          local_time assessment_number mean_daily_temp wind_ km_h   ws
## 1:   1 2020-06-04 00:00:00                NA             4.1        0.9 0.25
## 2:   1 2020-06-04 00:15:00                NA             3.9        0.6 0.17
## 3:   1 2020-06-04 00:30:00                NA             3.9        2.0 0.56
## 4:   1 2020-06-04 00:45:00                NA             4.3        1.2 0.33
## 5:   1 2020-06-04 01:00:00                NA             3.7        2.4 0.67
## 6:   1 2020-06-04 01:15:00                NA             3.5        1.3 0.36
##    ws_sd  wd wd_sd cummulative_rain_since_9am rain_mm wet_hours    location
## 1:    NA 215    NA                          0       0        NA Billa_Billa
## 2:    NA 215    NA                          0       0        NA Billa_Billa
## 3:    NA 215    NA                          0       0        NA Billa_Billa
## 4:    NA 215    NA                          0       0        NA Billa_Billa
## 5:    NA 215    NA                          0       0        NA Billa_Billa
## 6:    NA 215    NA                          0       0        NA Billa_Billa
##          lat      lon
## 1: -28.10115 150.3307
## 2: -28.10115 150.3307
## 3: -28.10115 150.3307
## 4: -28.10115 150.3307
## 5: -28.10115 150.3307
## 6: -28.10115 150.3307

Wrangle weather data

A function, format_weather(), is provided to convert raw weather data into the format appropriate for the model. It is mandatory to use this function to ensure weather data is properly formatted before running the model.

Billa_Billa <- format_weather(
  x = Billa_Billa,
  POSIXct_time = "local_time",
  temp = "mean_daily_temp",
  ws = "ws",
  wd_sd = "wd_sd",
  rain = "rain_mm",
  wd = "wd",
  station = "location",
  time_zone = "Australia/Brisbane",
  lon = "lon",
  lat = "lat"
)

Simulate Ascochyta blight spread

A function, trace_asco(), is provided to simulate the spread of Ascochyta blight in a chickpea field over a growing season.

# Predict Ascochyta blight spread for the year 2020 at Billa Billa
traced <- trace_asco(
  weather = Billa_Billa,
  paddock_length = 20,
  paddock_width = 20,
  initial_infection = "2020-07-17",
  sowing_date = "2020-06-04",
  harvest_date = "2020-10-27",
  time_zone = "Australia/Brisbane",
  seeding_rate = 40,
  gp_rr = 0.0065,
  spores_per_gp_per_wet_hour = 0.6,
  latent_period_cdd = 150,
  primary_inoculum_intensity = 100,
  primary_infection_foci = "centre"
)

Summarise the output

You can easily get summary statistics for the whole paddock over the simulated season and area under the disease progress curve, AUDPC, using summarise_trace().

summarise_trace(traced)
##      i_day new_gp susceptible_gp exposed_gp infectious_gp     i_date day
##   1:     1  16000          16000          0             0 2020-06-04 156
##   2:     2   1200          17200          0             0 2020-06-05 157
##   3:     3   1200          18400          0             0 2020-06-06 158
##   4:     4   1600          20000          0             0 2020-06-07 159
##   5:     5   2000          22000          0             0 2020-06-08 160
##  ---                                                                    
## 143:   143    400        1991999          0           734 2020-10-24 298
## 144:   144      0        1991999         28           734 2020-10-25 299
## 145:   145      0        1991999         28           734 2020-10-26 300
## 146:   146      1        1992000         28           734 2020-10-27 301
## 147:   147      0        1992000         28           734 2020-10-28 302
##             cdd cwh   cr gp_standard AUDPC
##   1:    0.00000   0  0.0          40 49393
##   2:   10.74583   0  0.0          43 49393
##   3:   22.84583   0  0.0          46 49393
##   4:   35.41042   0  0.0          50 49393
##   5:   49.38958   1  0.6          55 49393
##  ---                                      
## 143: 2133.81645  65 76.2        4980 49393
## 144: 2154.64770  73 94.4        4980 49393
## 145: 2176.49562  73 94.4        4980 49393
## 146: 2195.63104  73 94.4        4980 49393
## 147: 2215.57687  74 97.0        4980 49393

Code of Conduct

Please note that the ascotraceR project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

Reference

Diggle AJ, Salam MU, Thomas GJ, Yang H, O’connell M, Sweetingham M, 2002. AnthracnoseTracer: a spatiotemporal model for simulating the spread of anthracnose in a lupin field. Phytopathology 92, 1110-21.

ascotracer's People

Contributors

adamhsparks avatar ihsankhaliq avatar paulmelloy avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

ascotracer's Issues

Time class is not `POSIXct_time`

I am still getting an error Error in format_weather(x = Billa_Billa, POSIXct_time = "local_time", : 'POSIXct_time' is not class POSIXct

This should have been fixed via 32df19d ?

Current growing points are not equal to `gp_standard`

ascotraceR/R/one_day.R

Lines 112 to 116 in 3d96332

daily_vals[["new_gp"]] <-
calc_new_gp(current_growing_points = daily_vals[["gp_standard"]],
gp_rr = gp_rr,
max_gp = max_gp,
mean_air_temp = i_mean_air_temp)

If I'm interpreting it right, current_growing_points have been made equivalent to gp_standard, which is not correct because as definition gp_standard refer to uninfective_gp (standard growing points assuming growth is not impeded by infection)
Indeed, current_growing_points are the total number of growing points at an iteration period (both healthy + infected)

Should `calc_new_sp` return a errors

Should calc_new_gp return an error in the following tests?

# Test function if current growing points is zero
test1 <- calc_new_gp(
  current_growing_points = 0,
  gp_rr = 0.0065,
  max_gp = 15000,
  mean_air_temp = 24
)

# Test function if current growing points is a negative
test2 <- calc_new_gp(
  current_growing_points = -1,
  gp_rr = 0.0065,
  max_gp = 15000,
  mean_air_temp = 24
)

new_growing_points() missing a parameter input?

The function only takes current_growing_points and mean_air_temp but inside the function, the object, growing_points_replication_rate is called but not passed into the function nor created within the function.

Manuscript

@PaulMelloy I was talking about this graph listed in this paper https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8000037/pdf/plants-10-00464.pdf

Screen Shot 2021-08-06 at 11 34 20 am

We can just compare disease progress curve over time and not worry about distance. Tha is, months on x-axis and disease progress on y-axis. In addition, we can include growing points dynamics graph and submit it to Mycological Progress or MDPI journal. I can play with the words

I used the same approach in one of my papers from PhD. I just compared sporangia production curves, and did not do any statistics https://link.springer.com/article/10.1007/s11557-020-01578-4

Screen Shot 2021-08-06 at 11 43 28 am

Address from edge distance function may not be required

Summary unit length and width is 1 square metre, so everything gets divided by one and give some strange numbers

#' Estimates distance conidia travelled from the origin of dispersal
#'
#' 'address_from_edge_distance()' gives information on the possible destination
#' where conidia may land when dispersed by wind driven rain or rain splash
#'
#' @param summary_unit_width is the width of the observation quadrat/cell, thais is 1 square metre
#' @param summary_unit_length is the length of the observation quadrat/cell, that is 1 square metre
#' @param location[1] represents origin of dispersal
#' @param location[2] represents the destination where conidia land
#' @return distance in metres
#'
#' @keywords internal
#' @noRd
address_from_edge_distance <- function (location) {
c(1 + floor(location[1] / summary_unit_width),
1 + floor(location[2] / summary_unit_length))
}

`primary_infection_intensity` function is misleading

This is the description of the function The intensity of the starting epidemic as described by the number of number of sporulating growing points.
This is the function
if (primary_infection_intensity > seeding_rate) {
stop(
"primary_infection_intensity exceeds the number of starting growing points - 'seeding_rate': ",
seeding_rate
)
}

Reasons why it's invalid

  1. The function is saying conidia splash from primary foci (stubble), then cause primary infection. Intensity refers to how many lesions resulting from that primary spread, so lesions can be greater than seeding rate

  2. If I increase or decrease the value, it doesn't have much effect on the disease spread

  3. The major problem is the way the model is interpreting it. It the value is 100, then the model can produce a total of 100 lesions over the duration of the experiment

s-gp-1000

It the value is 1000, then the model can produce a total of 1000 lesions over the duration of the experiment

s-gp-1000

  1. When the function is temporarily removed, the model can produce only 4 lesions per quadrat over the duration of the experiment
    00d2c16c-72d7-4136-9951-0ce7da5a8c75

simplify `spread_spores` and nested functions

I am wondering if we need to have all the following functions nested within the function spread_spores. It might be easier to code it all into fewer nestings and cut down on passing parameters from the top function to the bottom function.

Nesting as follows
trace_asco
-> one_day
->-> spread_spores
->->-> interception_probability
->->-> spores_each_wet_hour
->->->-> spores_from_1_element
->->->->-> potentially_effective_spores
->->->->-> wind_distance
->->->->-> splash_distance
->->->->-> splash_angle
->->->->-> address_from_center_distance
->->->->-> adjust_for_interception
->->->->->-> successful_infections
->->->->->->-> interception_probability
->->->->->->-> random_integer_from_real

each "->" indicates how many functions the named function is nested in
TBC....

Can't load the package and import weather data

I've been away from pure R programming for over 3 months, so please bear with me.

First, the package won't load using devetools::load_all() getting this error Error during wrapup: Supplied column names are not found in column names of x Error: no more error handlers available (recursive errors?); invoking 'abort' restart AND directs me to row 228–230 in format_weather function

if(all(c(temp, rain, ws, wd, wd_sd, station) %in% colnames(x)) == FALSE){
stop("Supplied column names are not found in column names of x")
}

Second, I have tried 'install and rebuildbut that won't work either. Getting this errorExited with status 1.`

Third, I can't import Billa Billa weather data either via this commit ac28ee8
I've created a new branch chickpea, so working on this branch

Not sure what's happening?

calc_new_gp returns a floating point double

The calc_new_gp function needs to be checked in Mathematica code and literature that it is supposed to return a floating-point number.
I think it would make more sense if it returned an integer.

I am considering wrapping the output in the random_integer_from_real() function

Variables for the `data.table` `paddock` need to be agreed on

I think it would be much cleaner model and code if all variables relating to each paddock coordinate is contained and updated within a paddock data.table.

This is somewhat different to the Mathematica code which stores paddock values in a number of different lists with strikingly similar names i.e. (paddockUninfectiveGrowingPoints, paddockInfectiveGrowingPoints, paddockNewGrowingPoints, newlyInfectedList, infectiveElementsList, ... and others)

issues related to this are #45 #46 and #47

Use GitHub Actions in favour of Travis and Appveyor

Travis-CI is not going to be a viable option going forward, see this article:
https://ropensci.org/technotes/2020/11/19/moving-away-travis/

{tic} makes it very easy to set up and maintain CI and GitHub actions, https://docs.ropensci.org/tic/.

However, as this repository is private, you'll quickly run into issues using your allocated time for builds. Therefore, I suggest you wait until the repository is made public before using CI. In the meantime, you already have access to Windows and macOS to easily test and can install a VM if you need Linux.

Format weather function can't run lon_lat file

ascotraceR/R/trace_asco.R

Lines 94 to 104 in 07cd7dc

#' weather_dat <- format_weather(x = Billa_Billa,
#' POSIXct_time = "local_time",
#' temp = "mean_daily_temperature",
#' ws = "avg_wind_speed (km/h)",
#' wd_sd = "wd_sd",
#' rain = "rain",
#' wd = "wind_direction",
#' station = "location",
#' time_zone = "Australia/Brisbane",
#' lonlat_file = station_data
#' )

@PaulMelloy format_weather can't runlon_lat file taking me to the following function.

Screen Shot 2021-06-24 at 3 53 01 pm

The problem doesn't go away even if hash out the function or even remove it temporarily. Both weather data and lon_lat data can be imported/viewed, but it can't be passed through format_weather function due to this error. The package is loading/rebuilding a, so I'm not sure where is the problem

Where is the function to calculate uninfected or healthy growing point?

I've been looking for the function that calculates the number of uninfected growing points to paste it in the manuscript. It's equation-2 in Art paper, but I can't find the function for it in either mathematica or R scripts. Just update_ref_uninfective_gp is given, but the equation is different than that given in the Art Paper. Also, a note has been made that the update_ref_uninfective_gp function to calculate healthy growing points is replaced by calc_new_gp , which does not seem a good idea because both are different. Have we given it a different name? I've highlighted this in the comment manuscript too

`@param min_new_gp_for_half_limit` parameter is not required

We can discuss on Monday but @param min_new_gp_for_half_limit is not required. There is a comment is anthracnosetracer model not being used now and it's not being used any function in the script. I can't reference the exact lines in the issue because one_day function doesn't have any content here on github. Has one_day function been pushed to GitHub?

There is a mistake in the intercept_spores function

@PaulMelloy I wanted to verify the value of spore_interception_multiplier = 0.0006, so I went to back to the original model script. Not only I could not find any term spore_interception_multiplier' but I could not find this whole function. Upon closer look, I realised that a mistake was made in the function translation. That is 'spore_interception_parameter has been called spore_interception_multiplier. Please see screenshot of the mathematica code.
153129471_181228040101657_1757067568346875917_n

https://github.com/IhsanKhaliq/Ascotracer/blob/30b803097f215546d35016ba45772949304de46d/R/intercept_spores.R#L14-L19

Model is giving inaccurate results

Non_infected_gp, infected_gp and new_gp are not getting updated much as the season progresses (only in fractions). There are no infected_gp at all. The non_infected_gp value is 14938 (value is changing in fractions) from the begging to the end, and new_gp value is 0.50 (value is changing in fractions) from the begging to the end.

Growing points per quadrat values should start from lower values and gradually increase until maximum 15000 per quadrat. In a very few quadrats (when value changes from 0.50 to 1), when total growing points are added, the total value exceeds 15000, which is the upper limit on the number of growing points per quadrat.

Screen Shot 2021-08-03 at 11 31 51 am

ascotraceR/R/trace_asco.R

Lines 123 to 139 in 9bf310a

#' traced <- trace_asco(
#' weather = weather_dat,
#' paddock_length = 20,
#' paddock_width = 20,
#' initial_infection = "2020-07-16",
#' sowing_date = as.POSIXct("2020-06-04"),
#' harvest_date = as.POSIXct("2020-06-04") + lubridate::ddays(145),
#' time_zone = "Australia/Brisbane",
#' primary_infection_foci = "center",
#' seeding_rate = 40,
#' gp_rr = 0.0065,
#' primary_inoculum_intensity = 1000,
#' spores_per_gp_per_wet_hour = 0.22,
#' latent_period_cdd = 150)
#' traced[[145]]
#' write.csv(traced[[145]]$paddock, "testrun1.csv", row.names = FALSE)

It is impossible to know the number and location of primary foci under field conditions

Need some thinking on the issues. Farmers can put the location of stubble as random, but they would never know the number of infested stubble that will initiate infections. This message/option `stop("primary_infection_foci should be supplied as a numeric vector of length two. probably need deleting because if the location of stubble is random then it is not required anyway. Ps farmers would never be able to put the coordinates (they would remove the stubble rather than putting the coordinates in the model)

discussion: Lowering cumulative degree days latent period for chickpea model

I bumped into Kevin Moore today, bailed him up with a few questions.

One thing he mentioned was in an experiment the latent period was about 5-7 days, depending on host genotype, in glasshouse experiments with day night temperatures of 20 and 15 C.
This implies a cumulative degree day latent period of between 122.5 - 87.5, which is less than the 200 set in the model.
This is a parameter we might consider changing for the ascotraceR chickpea model

Wrap addresses function not appropriete

Just want to document and discuss dropping the function wrap_address.

I can't see the use for this function in spore dispersal models ever. Correct me if I am wrong, but the function seems to: if an infection coordinate is generated outside the paddock dimensions to takes the x or y coordinate and moderates it. for example

If the paddock dimensions are 100m x 100m and the grid is 1x1m
and a coordinate is generated of c(50,105) the function "wraps" this address so the output is c(50,5)

I am in favour of if a coordinate is generated which is outside the study area the coordinates are dropped. Therefore I suggest removing this function.

Rainfall threshold for spreading spores

I came across this filter for a rainfall threshold at 0.2mm in 1 hour
bd8aa28

I just want to check is this rainfall correct?
I had a quick looked in the Mathematica code and could not find a rainfall threshold.
If we do want to place a rainfall threshold, is this a parameter we want to put in the main function so the user can alter it?

interception_probability needs more testing

I am sceptical if the interception_probability function is correctly written.

More tests need to be written with realistic input values to determine if it will return a number other than 1 under realistic scenarios.

See commit a85694e

ascotracer needs to load data.table

I have tried to figure out how to load the data.table on loading ascotracer but my efforts have failed. Also the internet seems to suggest that having another package as a dependency is not a good idea. I understand this for packages that are not called often, however this is what we have done in blackspot.

Adam can you add data.table so it loads when ascotracer loads and describe how to do it with best practice please?

Dropping the `growth` function

I propose dropping the growth function and replacing to with two functions.

  1. A function which updates the non-infected growing points
  2. A function which updates the infected growing points

The reason for this is that a function should always return an output and not update objects in the environment. Unlike the Mathematica code which allows objects to be changed in a function without producing an output

Rain intensity needs to included as a parameter in the model

Discussed in meeting,
The amount of rainfall in a rain hour/event effects the potentially_effective_spores. However, this is not included in the model.

We could easily add this as a multiplier, we need coefficients from models to base this multiplier off.

@IhsanKhaliq could you provide references that report coefficients for rain quantity impacting spore dispersal

Notes - Mathematica functions: newlyInfective, makeSomeInfective

These are just notes to assist in understanding the model workflow, no comments needed.

infectPlantsAt = list / data.frame of coordinates

  • which is parsed through packetsFromLocations (which just wraps coordinates into the first element if a list, and adds a 1 to the second element )
    additionalNewlyInfectiveList <- infectPlantsAt i.e. list(c("x","y"),1)

Then additionalNewlyInfectiveList is used in function makeSomeInfective() and never used again.

makeSomeInfective

  • A sporePacket refers to additionalNewlyInfectiveList mentioned above.
  • sporesInPacket is numeric and 1 on the first run
  • paddockUninfectiveGrowingPoints a data.table for each 1x1m unit all containing the values -1 at the start.
    (a) coords with values less than -0.5 are added to infectiveElementsList (for coords from additionalNewlyInfectiveList) ; then
    (b) paddockUninfectiveGrowingPoints (for coords from additionalNewlyInfectiveList) are updated with refUninfectiveGrowingPoints (40 the seeding_rate)
    (c) (i) infectionsNew <- paddockUninfectiveGrowingPoints which are then less than sporesInPacket (1 as allocated in packetsFromLocations)(none on first run with coords from additionalNewlyInfectiveList) ) and
    (ii) update that paddockUninfectiveGrowingPoints value <- 0
    (d) (i) infectionsNew <- sporesInPacket (1) when paddockUninfectiveGrowingPoints is equal or greater than sporesInPacket ( additionalNewlyInfectiveList coords on first run) and
    (ii) update paddockUninfectiveGrowingPoints value <- paddockUninfectiveGrowingPoints - infectionsNew (first run: 40 - 1)
  • finally paddockInfectiveGrowingPoints (note: Infective not uninfective) <- paddockInfectiveGrowingPoints + infectionsNew (first run: 0 + 1)

Therefore on the first run the function makes the following changes to global environment variables

  • infectiveElementsList contains coords from additionalNewlyInfectiveList)
  • paddockUninfectiveGrowingPoints at coords from additionalNewlyInfectiveList contain value 40
  • paddock__Infective__GrowingPoints at coords is updated to contain value 1

Need to make a decision on whether packets_from_locations function is required or not

To be discussed in the fortnightly meeting. No comments required

#' To be deleted after discussion
#'
#' @keywords internal function
#'
#' @noRd
packets_from_locations <- function(location_list) {
for (index in seq_along(location_list)) {
packet_list <- dplyr::bind_rows(packet_list,
c(address_from_edge_distance(location_list[[index]]), 1))
}
return(wrap_addresses(packet_list))
}

Parameters missing from the model

https://github.com/IhsanKhaliq/Ascotracer/blob/d241125729ce383ec56f3a9ff8b69f3deb3789c4/R/trace_asco.R#L48-L61

Table 3 of Art paper lists parameters used in the model. When I look at the tras_asco function it has the following parameters missing
Distance due to rain splash
Distance due to wind
Spore deposition
Rainfall threshold
Potentially infective spore pro
The duration for which when a new growing point is susceptible
Base temperature for spore growth

Capture
There are many additional parameters in trace_asco function, but I guess there is nothing wrong with the additional parameters. But we should add missing parameters.
I can add them if you like.

spore_interception_multiplier value does not seem correct

Paul, in tras_asco function signature Line 56, the spore_interception_multiplier value is 0.00006. In the anthracnosetracer model it is called sporeInterceptionParameter and its value is 0.00006 maxGrowingPointsLimit /maxNewGrowingPointsLimit . So we need to change the name and value?
Screen Shot 2021-02-15 at 12 07 50 pm
This is the definition (* the parameter which controls the relationship between uninfective \ growing points per area and probability of a spore causing an \ infection *)

Extra columns for `format_weather` function

The format_weather function has been pulled in from the PaulMelloy/blackspot package. Originally temperature did not feature as an argument for the function. Temperature is needed in Ascotracer and this argument is added.
However Ascotracer uses daily mean temperatures to calculate degree days and inform the maturation of the crop and spores.
We may need to provide an option to specify columns:

  • daily_mean_temp for mean daily temperature
  • temp for mean temperature for the aggregated row time unit.

Model output do not match with the `tracer_plot` output

When the primary_infection_intensity is 1000. I get below output in CSV and `tracer_plot

Capture

1000

As you can see, there are a lot more sporulating_gp/spread in CSV file than shown in the `tracer_plot

In contrast, when primary_infection_intensity is 2. I get below output in CSV and `tracer_plot

Capture22

2

We are getting a lot more spread when primary_infection_intensity is 2 than 1000. Not only it doesn't match CSV, but also it should be the other way around. That is, more spread should be observed when primary_infection_intensity is 1000 in tracer_plot

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.