Dubious fluorescence energies in Heed

Hello,
I decided to check energies of fluorescence photons returned by Heed. Normally they would be reabsorbed and any deviations would go under the radar. I extracted them and their energies seem odd.

Here is example generating script:

import ROOT
import os, sys
import ctypes
import numpy

path = os.getenv('GARFIELD_INSTALL')
if sys.platform == 'darwin':
    ROOT.gSystem.Load(path + '/lib/libmagboltz.dylib')
    ROOT.gSystem.Load(path + '/lib/libGarfield.dylib')
else:
    ROOT.gSystem.Load(path + '/lib/libmagboltz.so')
    ROOT.gSystem.Load(path + '/lib/libGarfield.so')

# Noble gases except helium
gas_names = ["Ne","Ar","Kr","Xe"]
print("Fluorescence energies in:")
for gas_name in gas_names:
    fluorescence_energies=[]

    # Make pure gas
    gas = ROOT.Garfield.MediumMagboltz()
    gas.SetComposition(gas_name, 100.)
    gas.SetTemperature(293.15)
    gas.SetPressure(760.)

    # Some component with large area
    cmp = ROOT.Garfield.ComponentConstant()
    cmp.SetArea(-100,-100,-100,100,100,1000)
    cmp.SetMedium(gas)
    cmp.SetElectricField(0., 0., 100.)

    # Sensor
    sensor = ROOT.Garfield.Sensor()
    sensor.AddComponent(cmp)

    # Heed
    track = ROOT.Garfield.TrackHeed()
    track.SetSensor(sensor)
    track.DisableDeltaElectronTransport() # only care about photons
    track.EnablePhotonReabsorption(False) # disable reabsorption so we can extract photons

    # Shoot some photons of various energies and look for fluorescence
    for energy in numpy.arange(100,50000,0.1):
        nc = ctypes.c_int(0)
        ni = ctypes.c_int(0)
        np = ctypes.c_int(0)
        track.TransportPhoton(0,0,0,0,energy,0,0,1,nc,ni,np)
        for ph in range(np.value):
            xp = ctypes.c_double(0.)
            yp = ctypes.c_double(0.)
            zp = ctypes.c_double(0.)
            tp = ctypes.c_double(0.)
            ep = ctypes.c_double(0.)
            dxp = ctypes.c_double(0.)
            dyp = ctypes.c_double(0.)
            dzp = ctypes.c_double(0.)
            track.GetPhoton(ph, xp, yp, zp, tp, ep, dxp, dyp, dzp)
            # Ignore unabsorbed photons
            if not numpy.isclose(ep.value,energy):
                energy_out=str(round(ep.value,1))
                # Add new energies to storage
                if not energy_out in fluorescence_energies:
                    fluorescence_energies.append(energy_out)

    print(gas_name,": ",", ".join(sorted(fluorescence_energies,key=float)))

Output from that:

Fluorescence energies in:
MediumMagboltz::SetComposition: Ne
Ne :  848.6
MediumMagboltz::SetComposition: Ar
Ar :  232.7, 234.9, 310.6, 3190.2
MediumMagboltz::SetComposition: Kr
Kr :  1664.3, 1716.8, 1906.9, 14311.9
MediumMagboltz::SetComposition: Xe
Xe :  4773.9, 5094.9, 5440.9, 34548.9

Most notable thing is that there are no K alpha lines. For example in argon 2957 eV is the most intense fluorescence line (Table of Isotopes decay data). Moreover, energy values don’t correspond exactly to known transitions, xenon being good example (X-ray Transition Energies - Search Result).

When I look more into Heed it seems that it just takes energies of 4 lowest shells (from Heed/heed++/database/shelllist.dat) and subtracts energy of highest shell in it’s database. The numbers agree, I didn’t look how exactly it works in code. It’s a bit arbitrary way of finding fluorescence energies.

Can it be fixed?

Michał

I guess @hschindl can help.

I’ll do some poking in the code to remind myself how Heed calculates the probabilities/energies of the Auger electrons and fluorescence photons…

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.