Skip to content

Detector Calibration

Chris Kuethe edited this page Aug 20, 2023 · 3 revisions

Calibration establishes a relationship between analog-to-digital converter readings and real-world quantities. There are a number of factors that influence the measurment: photon energy, photon trajectory, scintillator efficiency, optical path inside the scintillation medium, photomultipler efficiency at the scintillation wavelength, photomultiplier dark current, photomultiplier gain, ADC resolution, temperature ... By measuring a variety of sources it is possible to compute a model that can reasonably accurately convert a large number of 526 into "potassium-40!" (for example)

Create the calibration file

calibrate.py -W will create an example calibration file. It contains some suggested elements and easily detected emission peaks. There is an intentional error ("unobtanium") in the template to prevent it from being used without at least a cursory look

{
  "unobtainium": "Remove this line after filling in actual calibration measurements. The channel mapping below is a rough (aka. wrong) linear model...",
  "americium": [
    { "energy": 26, "channel": 9 },
    { "energy": 60, "channel": 21 }
  ],
  "barium": [
    { "energy": 80, "channel": 28 },
    { "energy": 166, "channel": 59 },
    { "energy": 303, "channel": 109 },
    { "energy": 356, "channel": 128 }
  ],
  "europium": [
    { "energy": 40, "channel": 14 },
    { "energy": 122, "channel": 44 },
    { "energy": 245, "channel": 88 },
    { "energy": 344, "channel": 124 },
    { "energy": 1098, "channel": 395 },
    { "energy": 1408, "channel": 507 }
  ],
  "potassium": [
    { "energy": 1461, "channel": 526 }
  ],
  "radium": [
    { "energy": 295, "channel": 106 },
    { "energy": 352, "channel": 126 },
    { "energy": 609, "channel": 219 },
    { "energy": 1120, "channel": 403 },
    { "energy": 1765, "channel": 635 },
    { "energy": 2204, "channel": 793 }
  ],
  "sodium": [
    { "energy": 511, "channel": 184 },
    { "energy": 1275, "channel": 459 }
  ],
  "thorium": [
    { "energy": 338, "channel": 121 },
    { "energy": 583, "channel": 210 },
    { "energy": 911, "channel": 328 },
    { "energy": 1588, "channel": 572 },
    { "energy": 2614, "channel": 941 }
  ]
}

Edit the calibration

Remove the unobtainium, save the file, and compute the initial calibration factors

{
  "americium": [
    { "energy": 26, "channel": 9 },
    { "energy": 60, "channel": 21 }
  ],
  "barium": [
    { "energy": 80, "channel": 28 },
    { "energy": 166, "channel": 59 },
    { "energy": 303, "channel": 109 },
    { "energy": 356, "channel": 128 }
  ],
  "europium": [
    { "energy": 40, "channel": 14 },
    { "energy": 122, "channel": 44 },
    { "energy": 245, "channel": 88 },
    { "energy": 344, "channel": 124 },
    { "energy": 1098, "channel": 395 },
    { "energy": 1408, "channel": 507 }
  ],
  "potassium": [
    { "energy": 1461, "channel": 526 }
  ],
  "radium": [
    { "energy": 295, "channel": 106 },
    { "energy": 352, "channel": 126 },
    { "energy": 609, "channel": 219 },
    { "energy": 1120, "channel": 403 },
    { "energy": 1765, "channel": 635 },
    { "energy": 2204, "channel": 793 }
  ],
  "sodium": [
    { "energy": 511, "channel": 184 },
    { "energy": 1275, "channel": 459 }
  ],
  "thorium": [
    { "energy": 338, "channel": 121 },
    { "energy": 583, "channel": 210 },
    { "energy": 911, "channel": 328 },
    { "energy": 1588, "channel": 572 },
    { "energy": 2614, "channel": 941 }
  ]
}

This produces an incorrect, but nice looking set of calibration factors.

$ ./calibrate.py
data range: (9, 26) - (941, 2614)
x^0 .. x^2: [1.26860787, 2.77308657, 4.45e-06]
R^2: 1.00000

Gather some data

Am-241

Source: ionization-type smoke detector

am241_26 am241_60

K-40

Source: sodium-free salt substitute

k40_1461

Th-232

Source: thoriated tungsten welding electrode th232

Na-22

Source: custom manufactured sample

na22_511 na22_1275

Clone this wiki locally