Dotted lines and asynchronous behaviour in tropical trees

A lot of the Jungle Rhythms project is shrouded in secrets. Some of them more elusive then others. One of these secrets is the reason for the dashed appearance of some of the life cycle events in the hand written notes, instead of the usual full lines or cross hatched lines.

Dotted lines in a Jungle Rhythms yearly section[/caption]

These dashed patterns are very difficult to transcribe. The question therefore remains, should it be transcribed to begin with? From a data retention point of view the answer is simple, yes. Any data which is not marked, as written in the original, is data lost. However, this might not be a convincing argument for most citizen scientists, as they are a nuisance to mark, nor does it explain the underlying nature of this signal.

Browsing through some of the data I found evidence for mixed use of dashed / alternating patterns and full lines (marking a continuous process, see right side of the example above). This suggest that the alternating pattern is true, and not a different style of marking continuous life cycle events.

Tree displaying multiple life cycles[/caption]

Thinking about the dotted line problem, I realized that this might have been the way to mark the occurrence of multiple asynchronous growth phases on the same tree. Partial blooming, fruit and leaf development are common among tropical species and obviously hard to classify as a continuous and discrete process, the tree doesn’t behave as one. A picture I took near the Congo river in Yangambi shows a tree displaying three different leaf development stages is shown above. Here, the dull green leaves are the old ones, the bright green leaves are new ones, while the yellow / red ‘leaves’ are either very young leaves or fruit

Until I find the protocol used in creating these tables I will not know for sure. However, cross referencing some species with known life cycle behaviour in existing databases could confirm that dotted lines in the markings are those with partial blooming / leaf out. My search for answers continues.

Why Jungle Rhythms’ pages are yellow

One of the main reasons to digitize the large summary tables used within the Jungle Rhythms project was to save a digital copy of the physical original. The original copy as stored in the Yangambi herbarium was in a dire state, and preservation was a primary concern. Certain paper, when not stored properly, has the tendency to yellow and slowly become brittle and decay as time passes.

Mainly, newsprint and some other papers are made from ground wood or straw contain more non-cellulose compounds (lignin) compared to cellulose in European paper (pure cellulose) or grass fibers in Asian style paper.  These non-cellulose compounds and lignin in particular are subject to oxidation, which alters their molecular structure by turning them into amongst others phenolic acids, and changing the colors we perceive to yellow and brown.

These phenolic acids not only make the paper yellow, they also make it brittle. These days paper will have either all lignin removed, or will contain an alkaline substance (calcium bicarbonate) to neutralize any lignin left, this kind of paper is called acid-free paper.

Luckily the paper used for the summary tables was sufficiently thick to keep it from falling apart due to oxidation. However, even so it was not safe from water damage or the occasional rodent looking for nesting material. The current state of the paper is therefor a mix of internal paper chemistry, adsorption of dust and dirt, water damage and mechanical damage / stress (rodents, manipulation,…).

(sections copy edited from the Smithsonian Institution Archives. For more information see this research abstract and the series of articles.)


Warm winter weather confuses plants

Warm December weather dominates in both the north eastern part of the US as well as large parts of Europe. At both sides of the ocean this warm weather makes plants equally confused.

Many plants are blooming in New York’s botanical gardens and Boston parks. It’s unlikely that most perennial plants will suffer irreparable damage. However, Belgian fruit farmers fear that an untimely frost on the unhardened fruit trees might have serious consequences for both the tree vigour and fruit yields (see movie below).

Plants can withstand frost, however, the continuous warm weather in Belgium has left many trees not acclimated to true winter conditions. A sudden return to normal, freezing, winter conditions could cause frost damage to tissues otherwise protected by a tree’s natural anti-freeze, e.g. sugars in living tissue.

With no real frost days in Belgium the effect of this mild winter might even extend into next year’s spring. Many trees need a certain amount of chilling days, or days which are sufficiently cold / freezing, to trigger a proper leaf-out response next spring. High spring temperatures should move the development of leaves towards earlier start dates. However, a lack of chilling days has shown to delay this expected response to warmer spring temperatures. Warm winter temperatures therefore not only pose an immediate risk, due to sudden freezing of tissue, but have delayed consequences which extend into the next growing season.

(Header image: early leafing Sambucus nigra)

PhenoCam grassland paper accepted

I haven’t made much noise about this but the grassland study I submitted to Nature Climate Change was accepted. I’m working on the final edits to resubmit after Christmas. I’m rather happy with this outcome. For more details I suggest to keep an eye on the Nature Climate Change portal. I will discuss the work in detail after the press moratorium.

With the upcoming data paper, presenting an extensive dataset of curated PhenoCam data, there might be enough data to do more grassland related work as many grassland sites were added, where I was rather data limited before.

Scraping Zooniverse statistics

In order to keep track of the Jungle Rhythms project I wanted some basic summary statistics, as shown on the front page of the project. However, the front end API of the project does not allow these basic statistics to be pulled from a database. Furthermore, fetching all the project data can only be done once a day (to prevent heavy traffic on the database), keeping me from generating these statistics myself. Still, I want to keep track of how classifications and users change across time.

So, I wrote a web scraper in R which I run every half hour. It renders the page using PhantomJS, as it is a dynamic page. It then grabs the resulting html file and puts it through the rvest R package to extract all necessary (time stamped) elements and writes everything to file. It updates a file if it exists. You can find the code (an R function) below.

#' Grab basic zooniverse statistics from the front page of a project
#' @param url: Location of zooniverse project
#' @param file: the name of the output file to export statistics to
#' @param path: location of the phantomjs binary (system specific)
#' @keywords zooniverse, statistics, web scraping
#' @export
#' @examples
#' with defaults returns a file called users.stats.csv
#' for the Jungle Rhythms project
#' [requires the rvest package for post-processing]
#' []
#' <- function(url="",
  # read the required libraries
  # grab current date and time (a time stamp)
  date = format(Sys.Date(),"%Y-%m-%d") 
  time = format(Sys.time(),"%H:%M")
  # write out a script phantomjs can process
  # change timeout if the page bounces, seems empty !!!
  writeLines(sprintf("var page = require('webpage').create();
           '%s', function (status) {
                     if (status !== 'success') {
                     console.log('Unable to load the address!');
                     } else {
                     window.setTimeout(function () {
                     }, 3000); // Change timeout to render page
                     });", url), con="scrape.js")

  # process the script with phantomjs / scrapes zooniverse page
  system(sprintf("%s/./phantomjs scrape.js > scrape.html",path),wait=TRUE)
  # load the retrieved rendered javascript page
  main = read_html("scrape.html")
  # set html element selector (which html fields to retrieve)
  sel = '.project-metadata-stat div'
  # process the html file using selection and render as text
  data = html_nodes(main,sel) %>% html_text()
  # if data is retrieved, append to user.stats.csv file
  # if this fails, you most likely need more time to render
  # the page (see timeout above)
  if (!identical(data, character(0))){
    # kick out description fields and convert to numeric
    data = as.numeric(data[-c(2,4,6,8)]) 
    # merge into dataframe
    data = data.frame(date, time, t(data))
    colnames(data) = c('date','time','registerd_users',
    # append stats with the current date and time
    # to an already existing data file
    if (file.exists("user.stats.csv")){
  # remove html file and javascript



© 2018. All rights reserved.

Powered by Hydejack v7.5.1