Wiggle Match dating including post-bomb sample

36 views
Skip to first unread message

Morley Eldridge

unread,
Sep 10, 2025, 8:22:39 PMSep 10
to OxCal
Hi
We've been hoping to try wiggle match dating on culturally modified trees in British Columbia, Canada.  I know the flat curve since 1650 doesn't make this easy, but we do have a massive wiggle at about 1953 for a few years.  I was hoping that taking C14 samples at wide intervals might help resolve issues with trees that are already dead or have issues like extremely tight and possibly missing rings.  The example below is a yellow cedar, Chamaecyparis nootkatensis (with two new versions of the genus name now).  It can be very long-lived (we have a sample that was 1300 years old when commercially harvested) but these and western redcedar are unsuitable for dendro cross-dating due to reactions to cultural modification (greatly increased ring width and density, and huge changes in average ring width through time, with explosive growth followed by microscopic growth.  Anyway, the first one attempted has microscopic outer rings, but was partly alive and a sample from multiple rings yeilded a post-bomb date, which corroborates the field assessment.  We have two additional dates, one from the ring year of injury we want to date, and one from the sample pith, There is about 113 years separating the later two dates, and about 78 for the middle and pith dates.  I tried the following code, putting in an initial interval to reflect missing and uncertain rings in the sapwood where the outer sample was taken.  I got errors on the latest date using a negative number (as its a post-bomb date).  Is there any way to make this work?
Morley Eldridge

 Plot()
 {
Sequence()
{
Boundary("Start");
Interval(N(20,10));
R_Date("R28Outer",-50,1);
Interval(N(113,1));
R_Date("R28Middle",160,30);
Interval(N(78,9));
R_Date("R28Inner",190,30);
Boundary("End");
}; };


Erik Marsh

unread,
Sep 11, 2025, 10:48:38 AMSep 11
to OxCal
Hi Morely –
I'm no dendro expert, but this code will get you moving in the right direction. Sequences require older dates first, and you can specify a post-bomb curve, which then uses IntCal for the other dates. I used zone NH2, but you are on the edge of NH1 (Hua et al. 2022). Your region has good dendro data, so you could make more direct comparisons to those trees, instead of using the global trend.

The model could be improved if you included the date of felling and the tree's age. You could also use Date() to include rings without radiocarbon dates, since you have well-constrained intervals (given possible missing rings, are the error ranges too low or perhaps non-normal?).

Hope this helps, Erik


 Plot()
 {
  Curve("Bomb21NH2","bomb21nh2.14c");
  Sequence()
  {
   Boundary("Start");
   R_Date("R28Inner",190,30);
   Interval(N(78,9));
   R_Date("R28Middle",160,30);
   Interval(N(113,1));
   R_Date("R28Outer",-50,1);
   Interval(N(20,10));
   Boundary("End");
  };
 };

Morley Eldridge

unread,
Sep 12, 2025, 4:31:14 PMSep 12
to ox...@googlegroups.com
Thank you Eric, that really helps, especially making newbie mistakes like not ordering from oldest to more recent.  I'm trained to think from most recent (and securely known) to most ancient (all that entropy) and in excavation work from the surface to progressively deeper and older!  I also forgot about the different views - the model view prompts you to go earliest first!  In this case the bomb curve would only apply to the most recent date; the other two are pre-bomb.  Checking with Hua et al, the samples are securely from the mid latitudes within NH1 so that's an easy fix.  Does the program recognize the negative value ?  Was my use of -50- correct or should the percent modern values be used instead?  

This is a clip of the tree rings.  The tree rings have normal variation through much of the tree's life, but start to get compressed and possibly locally missing or false rings in the last few years of heartwood; then at the right side,  the sapwood is a bewildering mass of narrow linear streaking where individual rings cannot be securely identified except in localized areas, so a continuous count is highly unreliable.  Thus the cutting age of the tree, 2023, and the presumed last ring of that year (my assistant is positive the tree was alive, and this is the only area with clear sapwood) seems iffy.  
image.png
I have the following as the code now, rearranging the order and inserting the cutting date and the assumed maximum age of the tree.  I'm not sure I did this right, and the 'run' on the model gives lots of warnings. 

 Plot()
 {
  Sequence()
  {
   Boundary("Start");
      Date ("tree age estimated maximum", 220
      R_Date("R28Inner",190,30);
      Interval(N(78,9));
      R_Date("R28Middle",160,30);
      Interval(N(113,1));
    Curve("Bomb21NH1","bomb21nh1.14c");
      R_Date("R28Outer",-50,1);
      Interval(N(20,10));
      Date("tree cutting date",2023);
   Boundary("End");
  };
 };

Any comment would be most welcome!
Morley

--
You received this message because you are subscribed to a topic in the Google Groups "OxCal" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/oxcal/y88Cu4c8PdU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to oxcal+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/oxcal/f2bb944f-e66e-4c6f-a14b-a05546018cf2n%40googlegroups.com.

Morley Eldridge

unread,
Sep 12, 2025, 4:33:44 PMSep 12
to ox...@googlegroups.com
Ah, sorry, I had edited the code to go latest to earliest but left the programs open and apparently lost my edits.  I'll rearrange and try again.
Morley

Morley Eldridge

unread,
Sep 12, 2025, 4:48:47 PMSep 12
to ox...@googlegroups.com
Brain fuzz, earliest to latest, here is the reordered:

 Plot()
 {
  Sequence()
  {
   Boundary("Start");
   Date ("tree age estimated maximum",220);
   R_Date("R28Inner",190,30);
   Interval(N(78,9));
   R_Date("R28Middle",160,30);
   Interval(N(113,1));
   Curve("Bomb21NH1","bomb21nh1.14c");
   R_Date("R28Outer",-50,1);
   Interval(N(20,10));
   Date("tree cutting date",2023);
   Boundary("End");
  };
 };

MILLARD, ANDREW R.

unread,
Sep 15, 2025, 1:03:52 PMSep 15
to ox...@googlegroups.com

Hello Morley,

 

If the oldest possible date for the tree is 220AD based on the species longevity, I would place that outside the Boundary. It is such a distant constraint that it makes little difference anyway. Or do you mean the tree is maximum 220 years old? In which case use Date("tree age estimated maximum",1803); 

 

At the end I would combine the last two statements into

Boundary ("tree cutting date",2023);

as the boundary indicates the end of the sequence.

 

The biggest problem you have is that the date of -50±1 does probably calibrate to the early 2020s, but the published calibration data you are using in Bomb21NH1 only goes to 2020, so OxCal cannot model the date properly and wants to put it in the 1950s. I’m not sure if there are newer data published that you could extend the calibration dataset.

 

Best wishes 

Andrew 

-- 

Prof. Andrew Millard 

Department of Archaeology,

Durham University, UK 

Email: A.R.M...@durham.ac.uk  

Personal page: https://www.durham.ac.uk/staff/a-r-millard/ 

Dunbar 1650 MOOC: https://www.futurelearn.com/courses/battle-of-dunbar-1650 

 

Image

 

From: ox...@googlegroups.com <ox...@googlegroups.com> On Behalf Of Morley Eldridge
Sent: 12 September 2025 21:48
To: ox...@googlegroups.com
Subject: Re: Wiggle Match dating including post-bomb sample

 

You don't often get email from morley....@gmail.com. Learn why this is important

[EXTERNAL EMAIL]

Brain fuzz, earliest to latest, here is the reordered:

 

 Plot()

 {

  Sequence()

  {

   Boundary("Start");

   Date ("tree age estimated maximum",220);

   R_Date("R28Inner",190,30);

   Interval(N(78,9));

   R_Date("R28Middle",160,30);

   Interval(N(113,1));

   Curve("Bomb21NH1","bomb21nh1.14c");

   R_Date("R28Outer",-50,1);

   Interval(N(20,10));

   Date("tree cutting date",2023);

   Boundary("End");

  };

 };

 

 

On Fri, Sep 12, 2025 at 1:33PM Morley Eldridge <morley....@gmail.com> wrote:

Ah, sorry, I had edited the code to go latest to earliest but left the programs open and apparently lost my edits.  I'll rearrange and try again.

Morley

 

On Fri, Sep 12, 2025 at 1:30PM Morley Eldridge <morley....@gmail.com> wrote:

Thank you Eric, that really helps, especially making newbie mistakes like not ordering from oldest to more recent.  I'm trained to think from most recent (and securely known) to most ancient (all that entropy) and in excavation work from the surface to progressively deeper and older!  I also forgot about the different views - the model view prompts you to go earliest first!  In this case the bomb curve would only apply to the most recent date; the other two are pre-bomb.  Checking with Hua et al, the samples are securely from the mid latitudes within NH1 so that's an easy fix.  Does the program recognize the negative value ?  Was my use of -50- correct or should the percent modern values be used instead?  

 

This is a clip of the tree rings.  The tree rings have normal variation through much of the tree's life, but start to get compressed and possibly locally missing or false rings in the last few years of heartwood; then at the right side,  the sapwood is a bewildering mass of narrow linear streaking where individual rings cannot be securely identified except in localized areas, so a continuous count is highly unreliable.  Thus the cutting age of the tree, 2023, and the presumed last ring of that year (my assistant is positive the tree was alive, and this is the only area with clear sapwood) seems iffy.  

--
You received this message because you are subscribed to the Google Groups "OxCal" group.
To unsubscribe from this group and stop receiving emails from it, send an email to oxcal+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/oxcal/CAH06C7pUkHweqQqx0B3En-%3DUbgUN2mvtjAeHfeMjS7qkMYy-Ag%40mail.gmail.com.

Erik Marsh

unread,
Sep 15, 2025, 5:00:34 PMSep 15
to OxCal
Hi Moreley –
The bomb curve is better at the top so it's applied to all the dates. This is fine because it's actually two curves in one: the post-bomb curve and IntCal20 (which is the default curve anyway, so your code is fine there). Yes, the program recognizes the negative value in the most recent date. Some people prefer calibrating with % modern and doing so could be more precise – this is worth a try, though it might not make much of difference.

I got a reasonable result with this code. The two older dates have low agreement indices, but that's fine, since the intervals are more important that agreement between the calibrated date and the posterior estimate. The bigger problem was the final interval – it only resolved when I left it undefined (as a uniform distribution of 0–50 years). The posterior suggests this interval was <4 years and the latest radiocarbon date is from 2020 (correctly so?). But that could be just running into the end of the calibration curve, as Andrew points out. Improving the model will rely on firming up the age of the tree and defining intervals (as normal or uniform distributions) and uncertainties as best you can.

– Erik

 Plot()
 {

  Curve("Bomb21NH1","bomb21nh1.14c");
  Sequence()
  {
   Boundary("Max age of tree",N(1800,10));
   R_Date("R28 Inner",190,30);
   Interval("Inner-Middle",N(78,9));
   R_Date("R28 Middle",160,30);
   Interval("Middle–Outer",N(113,1));
   R_Date("R28 Outer",-50,1);
   Interval("Outer-cutting date",U(0,50));
   Boundary("Tree cutting date",N(2023,1));
  };
 };

Morley Eldridge

unread,
Sep 15, 2025, 6:37:19 PMSep 15
to ox...@googlegroups.com
Thanks Andrew, I missed that the Date needed to be a calendar date not an age.  And I'll go back and read the help on data entry formats again! I'll replace with 1803 - would it be appropriate to include an optional comma and an estimated error value to that, or is that even allowed data?

On the second point, the Beta calibration came back as 1999-2002 at 2 sigma (with a small intercept of 1957) so the latest date should not be bothered by the problematic post-2020 missing data.  I note they used Intcal20+NHZ1 rather than NHZ2 as their calibration dataset, but presume this will be a minor shift. 

I have been wracking my brain to explain how the outer sample, which included all the sapwood rings, could come back with that narrow a sigma (percent modern carbon 108.70 +- 0.41) if it included as many as 20 rings. (The assistant taking the samples was working hundreds of km away and got muddled about measuring the weight on a scale.  The scale could only resolve to 0.1 g and they thought a much larger sample was required, taking several grams instead - applied to each sample - instead of my direction to take wood from a single ring or from as narrow a sequence as possible).  I would much rather have had wood from the single last clearly visible ring, which should still be post-bomb, and which should have given us a good starting point for the date of indigenous harvest, which is a straightforward ring count from there.  I would have thought a group of 10 or 20 rings blended together would have a much larger sigma given the rapidly changing atmospheric radiocarbon situation. The data indicates the tree was indeed alive when cut in 2023, although I wish that had been documented better.  But even if the tree was dead and the outermost ring dates to 2002, the dating of a number of rings i would have thought would have resulted in an older 'averaged' date also with wider uncertainty. 
Morley

Morley Eldridge

unread,
Sep 15, 2025, 8:38:06 PMSep 15
to ox...@googlegroups.com
I seem to be stuck here:  Plot()
 {
  Sequence()
  {
   Date("tree pith date estimated maximum",1800);
   Boundary("Start");
   R_Date("R28Inner",190,30);
   Interval(N(78,9));
   R_Date("R28Middle",160,30);
   Interval(N(113,1));
   Curve("Bomb21NH2","bomb21nh2.14c");
   R_Date("R28Outer",-51,1);
   Interval(N(20,10));
   Boundary("End");
   Date("tree cutting date",2023);
  };
 };

When I click the 'run' button, it gets to 'reading data', the bar shows progression to about half way, then it simply disappears.  I suspect something fundamental and simple.....
Morley

Morley Eldridge

unread,
Sep 15, 2025, 8:44:15 PMSep 15
to ox...@googlegroups.com
Thanks Eric, I copy and pasted your code into the screen and saved - I'm still not seeing any results with a 'run'?
Morley

Morley Eldridge

unread,
Sep 15, 2025, 9:02:28 PMSep 15
to ox...@googlegroups.com
Eric, 
Thanks!  The posterior of 4 for seems too short for an interval between outer to cutting date - I think the -51 (+-1) calibrating at 2002 seems a likely result even if this part of the tree had died about then (the sapwood here was the 'brightest' and likely include the latest rings, even if the assessment of the tree as 'alive' was incorrect).  However, see my answer to Andrew wondering why this result would be returned for a group of rings).  The most important interval is middle to outer, as the 
Morley

MILLARD, ANDREW R.

unread,
Sep 16, 2025, 5:08:09 AMSep 16
to ox...@googlegroups.com

Hi Morley,

 

I don’t understand why you have switched from NH1 to NH2 here, and from -50±1 to -51±1 for R28Outer. In any case, if your pMC value of 108.70± 0.41 is fractionated corrected then it does not correspond to -50, but to -670 and calibrates to about 2002. NH1 and NH2 are identical at this point so it does not matter which you use. The precision comes from the measurement of the homogenised sample, so the uncertainty is the uncertainty on the mean radiocarbon content of however many rings you had.

 

Assuming the pMC is fractionation corrected and therefore equivalent to F14C my version of the model would be

 

Options()

{

  Resolution=1;

  Curve="bomb21nh1.14c";

};

Plot()

{

  Sequence()

  {

   Boundary("Start");

   R_Date("R28Inner",190,30);

   Interval(N(78,9));

   R_Date("R28Middle",160,30);

   Interval(N(113,1));

   R_F14C("R28Outer",1.0870,0.0041);

   Interval(N(20,10));

   Boundary("tree cutting date", 2025);

  };

};

 

I took out the maximum age as it did not seem to fit very well, and indeed the R28inner range is 1789-1816. The R28Middle data does not fit well (A=48%), largely because its posterior value is derived from the precise 1999-2003 calibration of R28Outer and the precise interval of 113±1. Are you really that certain about the number of rings from middle ring of R28Middle to the middle ring of R28Outer? From how you describe the sampling, I would think that the number of rings in R28Outer is not known that precisely.

 

 

Best wishes 

Andrew 

-- 

Prof. Andrew Millard 

Department of Archaeology,

Durham University, UK 

Email: A.R.M...@durham.ac.uk  

Personal page: https://www.durham.ac.uk/staff/a-r-millard/ 

Dunbar 1650 MOOC: https://www.futurelearn.com/courses/battle-of-dunbar-1650 

 

Image

 

From: ox...@googlegroups.com <ox...@googlegroups.com> On Behalf Of Morley Eldridge
Sent: 16 September 2025 01:38
To: ox...@googlegroups.com
Subject: Re: Wiggle Match dating including post-bomb sample

 

[EXTERNAL EMAIL]

Morley Eldridge

unread,
Sep 16, 2025, 7:33:59 PMSep 16
to ox...@googlegroups.com
Andrew,
Profuse thanks again!  I'd reversed the locations of NH1 and 2 in my memory, I looked up Hua et al 2022 again and yes NH1 is of course correct.  I also finally found the results of the 'run' command, stored in a local file rather than being automatically displayed in a new window.  With these available some of the earlier comments from Eric and yourself are clearer to me. Thanks also for showing the format to input F values, that seems to work with less room for user error. 

I'm reasonably sure of the ring count between 'inner' and 'middle' date, and some more sanding of the pith area could potentially further reduce the uncertainty.  The 'middle'  (which centres on the ring-year-of-injury with which we are concerned, and luckily the wide rings there meant that only three years were included in this sample) and the last clear ring is also confident.  The last clear ring is the start of the 'outer' sample including an unknown number of sapwood rings. The gap I'd assigned would not include the additional rings to the middle of the sample, so I have increased both the count and uncertainty value here.  I noted that the results in the 'unmodelled' columns show that the error I input on the Dates and Intervals are treated as one-sigma when I had intended them as effectively two sigma values.  I've reduced those values by about half to reflect this. 

In terms of what could cause the poor agreement for R28Middle, I think I have it up slightly with the increased uncertainty of the middle-outer interval but what is causing this compared to the others?  Is it because the fit to the post-bomb date puts it in a low part of the calibration curve?  If it was allowed to shift earlier (or later) that might bring it out of 'poor' agreement?

Morley

My tweaks to your model:
 

Options()

{

  Resolution=1;

  Curve="bomb21nh1.14c";

};

Plot()

{

  Sequence()

  {

   Boundary("Start");

   R_Date("R28Inner",190,30);

   Interval(N(78,3));

   R_Date("R28Middle",160,30);

   Interval(N(120,2));

   R_F14C("R28Outer",1.0870,0.0041);

   Interval(N(20,10));

   Boundary("tree cutting date", 2023);

  };

};

 

Morley Eldridge

unread,
Sep 16, 2025, 8:30:24 PMSep 16
to ox...@googlegroups.com
Ah- took another look at the sample images and increased the middle-outer interval to 120,+-4, and the poor agreement warning has disappeared and the 'middle' date posterior for our bark harvesting has narrowed to AD 1874-1886, which seems very likely. That finishes that sample - hopefully others I can adapt this model to.
Morley

Morley Eldridge

unread,
Oct 1, 2025, 7:43:53 PM (3 days ago) Oct 1
to OxCal
The other sets of samples went well, inlcuding getting a good result on a tree that had been dead, standing, for nearly 200 years.  One set of samples was taken from a tree that had been recorded as standing dead by three sets of archaeologists from three companies over a 20 year span.  However, when felled, the tree showed apparently living sapwood on one part of the stem.  This was confirmed by dating the outer rings and getting a result consistent with 2023.  Some 299 years earlier by direct ring count, a strip of cedar bark had been harvested by aboriginal people.  And 95 years before that the tree's growth reached the height of a third sample from the pith.  The model ran very well, with an expected warning of the age potentially exceeding the range (as the calibration curve ends before the tree was cut). The earliest date is from the 'inner' sample with calibrated unmodelled date of the 1500s or early 1600s which predates the the long 'flat' part of the calibration curve during the Industrial Revolution to the mid 20th century.  The modelled dates were a good fit with the direct ring counts.

I was curious and wanted to mimic the situation where no live wood was present and only the pre-bomb data had been available, so cut out the latest date and the latest interval.  Contrary to my expectaton, the model had a poor fit and seems to model some long periods of the 19th century that don't appear possible.  But looking at the plot against curve, it seems that the two older dates with a known interval of 95 years between them could only fit in a relatively narrow span, only slightly greater than the full model.  Did I do something wrong with the data or does wiggle matching sequence dating require three or more radiocarbon dates?

I'll add the two models as code below, and attach the plots against calibration curve in another post, as it seems to crash when I try here.
Morley

Full model:
 Options()
 {
  Resolution=1;
  Curve="bomb21nh1.14c";
 };
 Plot()
 {
  Sequence()
  {
   Boundary("Start");
   R_Date("R77 Inner",310,30);
   Interval(N(95,1));
   R_Date("R77 Middle",100,30);
   Interval(N(294,1));
  R_F14C("R77 Outer",1.00750,0.0038);
   Interval(N(3,1));

   Boundary("tree cutting date", 2023);
  };
 };


Truncated model with only the earlier two dates and one interval:
 Options()
 {
  Resolution=1;
  Curve="bomb21nh1.14c";
 };
 Plot()
 {
  Sequence()
  {
   Boundary("Start");
   R_Date("R77 Inner",310,30);
   Interval(N(95,1));
   R_Date("R77 Middle",100,30);
   
  };
 };

Morley Eldridge

unread,
Oct 1, 2025, 7:46:22 PM (3 days ago) Oct 1
to OxCal
R77modelled on two early dates.jpg
GbTn40_R77.pdf
R77 model result.pdf
Reply all
Reply to author
Forward
0 new messages