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ł