Saturday, October 10, 2015

Natural Roasts

People typically talk about the art of coffee roasting. We're interested in the science. Therefore, we keep adding features to Artisan that allow to analyze and compare roasts. Here we want to introduce our latest observation and the tools now available in Artisan v0.9.8 to play with the underlying idea.

On September 2015 Rafael Cobo added a post on HomeBarista titled Natural logarithm curve for roasting triggered by a discussion about Scott Rao on The FlickRafael wrote
"A decreasing deltaBT would theoretically approximate a natural logarithmic curve since the ln() function has a positive slope that decreases steadily as time increases."

This is an interesting obvervation, because the natural logarithm ln() is based on Euler's number e, which is understood as one of the fundamental mathematical constants, similar to π. Further, there is an interesting work on chemical kinetics that explains the relation of logarithms to the development of chemical reaction.

Natural Roast Model

Rafael proposed the following general formula to compute the temperature T in degrees (in C or F) to describe any profile that is steadily decreasing.

T = A*log(B*t-C,e)
T: the temperature in degrees (in C or F)
t: the time in seconds since CHARGE
e: Euler's constant as base of the natural logarithm (e=2.71828)
A: a multiplication factor
B: rate of change in combination with A
C: time shift to the right

The example Rafael gave for such a "natural" ln()-roast approximation
T = 65*log(1.618*t-350,e)
is plotted as thin black curve in the following profile using the Artisan plotter. Note that the above formula (without the "T=" can be directly pasted into one of the plotter fields in Artisan).

Note that this ln() curve fits nicely the bean temperature (BT) from about 300F (DRY) on. Note also that this roast mostly fullfils Rao's criteria of an always declining BT rate-of-rise (RoR) curve drawn in light blue as computed by Artisan from the BT curve displayed in dark blue. Only towards the end of the roast, at the point the BT deviates from the ln()-curve, its RoR rises slightly.

The following shows the shape the RoR (in light blue) corresponding to this logarithmic curve (here in dark blue) as computed by Artisan.

To summarize, the observations that drove Rafael to its natural roasts model were:

  1. The ln() curve has an always positive slope that decreases steadily (the RoR incrementally decreases over time). This models the current trend in roasting in terms of RoR for best results based on empirical results.
  2. The concentration of chemical products in a first order reaction follows a logarithmic curve. Most reactions speed up as temperature increases and the concentration of reactants decreases. There could be some parallels between RoR and speed of the chemical reaction.

Natural Roasts in Artisan

Looking at my recent roast profiles I could see that most of my successful ones seem to follow that natural roast model. However, I had a hard time to find the right constants A, B and C to draw the corresponding natural logarithm curve on my profiles using the plotter.

Therefore, I added a function in v0.9.8 that calculates the best approximation of the current profile and thus automatically determining those three constants. The function takes the following three time/temperature points as input from the current profile:

  1. CHARGE (the moment the beans are filled into the machine): assuming the BT of the green beens to be at room temperature standardized to 22C/70F (ignoring the BT reading of the profile here)
  2. DRY (the moment the beans turn yellow)): an early point at which the measured BT can be assumed to be close enough to the real temperature of the beans
  3. FCs (the moment the beans start to make a cracking noise for the first time): a second point that can be determined relatively accurate

All one has to do now, is to load a profile and open the math menu (menu Tools >> Extras; Math tab) and click the Show flag in the ln() part.

Note that if the points DRY and FCs are not defined in the current profile (or erased by putting 0:00 in the corresponding time edit element of the Roast Properties dialog), those points are taken from the BT at the intersection with the corresponding phases limits. As those limits can be freely defined in the Phases Dialog (menu Config >> Phases) this allows to define those points as needed.

The resulting ln() approximation is shown as formula in the math tab (see the screenshot above), including the computed values for the constants A, B and C. The curve itself is drawn on top of the current profile as black dotted line with the three anchor points marked by red dots.

The calculated ln() formula displayed in the math tab can be copied directly into one of the plotter fields. If we choose the field P1 or P2, we can finally establish the curve as background profile by pressing the "Background" button, visualize the corresponding ln() RoR curve, and use it as template for further roasts.

The only thing that still remains to be decide upon is the temperature at which to DROP the roast best. Here, Rao's 20-25% commandment could be applied as supported in Artisan by the live display of the phases ratios in the Phases LCDs displayed on the top of the main window on them. Remember that one needs to right-click on those Phases LCDs to get the ratios displayed.

Looking at the last profile above one can see how close this ln() approximation fits to my roast P164. That observation holds for a lot of roasts done on my 80 years old cast-iron Probat drum roasts, but also on those I did on the latest Probatone.

It has been observed that this natural roast style better fits the slow-start and fast-finish roasts (SSFF) than to the fast-start slow-finish roasts (FSSF) as advocated by Rao and some others. While faster and slower roasts are possible along those ln() approximations as shown below, a real FSSF roast would suggest a lower RoR then given by the ln() formula at least from FCs on. But lowering the RoR during the FCs too much has also been found to result in weaker roasting results (cf. Rob Hoos'  book on Modulating the Flavor Profile of Coffee).

Here is a profile roasted on a small dynamic air roaster. A typical FSSF profile. It remains to been seen if a roast along this ln() approximation leads to better results than the original profile or if a compromise, roasting along the ln() approximation until FCs and then following a slightly lower RoR towards the end of the roast, would win.

An approximation using a quadratic function of the form

T = A*t^2 + B*t + C

was also discussed on HomeBarista and has been added to Artisan. While closer to the FSSF roasting style, this one seems to have the problem that it drops at the end of the roast even if the DROP point is considered in the regression as shown in the following.

The quadratic approximation seems to work better for that air roaster profile from above. Just the first phase seem to deviate significantly as can see below.


  1. A wonderful addition to an already remarkable gift to us roasters!

  2. That's brilliant feature! Good work!

  3. Hello Marko,

    I am using 9.8RC2 on a Windows 7 Pro 64 bit OS driving a Hottop B2K+. I really like the ln() background plot feature to guide roasts.

    In using the program I've noticed the ordering and association of the Alarms is still at the mercy of Artisan's own, indecipherable priority matrix. It seemed that this was resolved for a while by simply using the ID sorting tab. Unfortunately, after several saves the program took over and the IDs no longer match the original alarms. For example, setting the fan speed after first crack might have originally been ID 7 but after a while it becomes associated with ID 2.

    This reordering does not impact the roast but it makes modifying alarms more difficult than necessary. I would like to keep the alarm IDs associated so when I sort they correspond to the roast progression. It makes finding a specific alarm much easier. Instead I now need to search the entire table for the specific alarm since they no longer show in roast progression order.

    Other than that, this is an excellent program. Hopefully you can make it so the alarm IDs stay with the alarms as I originally define them.

    1. Sorting should have never been introduced to alarms. I fixed that (again)! Thanks for reporting. The fix will be part of the final v0.9.8.

    2. I appreciate your effort. BTW, I wouldn't use the ID sort if the program didn't resort the original ordering when they number over 10. I take it this is one of those nice to have features that you wish you'd never heard mentioned. Thanks for entertaining the idea and trying to resolve it.

  4. I would love an explanation of how more advanced functions, like the Math tool, can benefit roasters like me who either can't comprehend all the complex math or simply don't want to. This feature seems like a great tool but I get totally lost in all the explanations about formulas and logarithmic curves, etc. I just want to know, in as simple a description as possible, how can I use this to my advantage without having to go back to school to learn calculus? Is there a way for you to simplify things by just saying, "If you click on 'ln()' it will project a curve on your existing roast curve that approximates an ideal path for a steadily declining RoR." That's what I took away from this article but what about the other options? What do they do? And what is a 'natural roast'? Does that refer to naturally (dry) processed coffees or a 'natural' style of roasting (whatever that might be)?