# Introduction

This very short note looks at the temperature dependency of the quantum efficiency of a CCD273. Because the temeperature of the instrument will vary over time, the induced quantum efficiency variations can lead to photometric errors over the Euclid Survey. This is especially important when good relative photometry over the complete Survey area is needed.



In [1]:

import matplotlib
matplotlib.rcParams['font.size'] = 17
matplotlib.rc('xtick', labelsize=14)
matplotlib.rc('axes', linewidth=1.1)
matplotlib.rcParams['legend.fontsize'] = 11
matplotlib.rcParams['legend.handlelength'] = 3
matplotlib.rcParams['xtick.major.size'] = 5
matplotlib.rcParams['ytick.major.size'] = 5
matplotlib.rcParams['image.interpolation'] = 'none'
from matplotlib.ticker import FormatStrFormatter
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.interpolate import interp1d
from scipy import array



# Data

## Raw Data

ESA (P. Verhoeve) have taken quantum efficiency (QE) measurements at three different temperatures using a CCD273-84-F15 (serial number 11263-07-01). The three temperatures adopted were 153K, 178K, and 203K and the QE measurements were taken with 20nm wavelength sampling.



In [2]:

filename='CCD273-84-F15ser11263-07-014chQE.txt'
names=['lambda', 'T153K', 'T178K', 'T203K'],
sep='\t')




In [3]:

fig = plt.figure(figsize=(8, 8))
ax1.set_title('CCD273-84-F15 (#11263-07-01)')
ax1.plot(data['lambda'], data['T153K'], 'rs-', label='153K')
ax1.plot(data['lambda'], data['T178K'], 'gD-', label='178K')
ax1.plot(data['lambda'], data['T203K'], 'bo-', label='203K')
ax2.set_xlabel(r'$\lambda \quad$ [nm]')
ax1.set_ylabel('QE')
ax2.axhline(y=1., c='k')
ax1.fill_between([550, 900], [1.1, 1.1], color='g', alpha=0.1)
ax2.fill_between([550, 900], [1.3, 1.3], color='g', alpha=0.1)
ax2.plot(data['lambda'], data['T153K']/data['T178K'], 'rs-')
ax2.plot(data['lambda'], data['T203K']/data['T178K'], 'bo-')
ax1.set_xticks([])
ax2.set_ylabel(r'QE(T) / QE(173K)')
ax1.set_xlim(330, 1080)
ax2.set_xlim(330, 1080)
ax1.set_ylim(0, 1.)
ax1.set_ylim(0, 1.)
ax2.set_ylim(0.82, 1.18)
plt.show()






The above Figure shows the raw QE data. The green shaded area shows the VIS bandpass that ranges from 550 to 900nm. The lower panel of the Figure shows the ratios of the QE at 153K (red) and 203K (blue) with respect to the reference, chosen to be at 178K (green). It is obvious that the CCD QE temperature dependency is strongest in the red, reaching to about $5$ per cent at 900nm when the temperature was changed by 25K.

# Results

## Quantum Efficiency as a Function of Temperature

We can now use the raw data to look at the QE as a function of temperature $\mathrm{QE}(T)$. Because the nominal operational temperature of the VIS CCDs is 153K, coinciding with the lowest temperature where the QE was measured, we need to extrapolate to probe a range of $\pm 0.8$K around the nominal operational temperature.



In [4]:

newT = np.asarray([152.2, 153.8])




In [5]:

def extrap1d(interpolator):
"""
Allows point wise extrapolation if interpolation is not possible.
"""
xs = interpolator.x
ys = interpolator.y

def pointwise(x):
if x < xs[0]:
return ys[0]+(x-xs[0])*(ys[1]-ys[0])/(xs[1]-xs[0])
elif x > xs[-1]:
return ys[-1]+(x-xs[-1])*(ys[-1]-ys[-2])/(xs[-1]-xs[-2])
else:
return interpolator(x)

def ufunclike(xs):
return array(map(pointwise, array(xs)))

return ufunclike




In [6]:

def interpolateToTemperature(data, newT):
"""
Allows to interpolate between temperatures if cannot interpolate then will extrapolate.
"""
low = []
high = []
for i, tmp in enumerate(data['lambda']):
f_i = interp1d([153, 178, 203],
data[['T153K', 'T178K', 'T203K']].loc[i].as_matrix())
f_x = extrap1d(f_i)
l, h = f_x(newT)
low.append(l)
high.append(h)
data['T%.1fK'% newT[0]] = low
data['T%.1fK'% newT[1]] = high
return data




In [7]:

data = interpolateToTemperature(data, newT)



We can now generate a Figure showing how the quantum efficiency varies if the temperature changes $\pm 0.8$K. Note that the lower panel showing the ratio with respect to the nominal temperature of 153K has been multiplied with 100 for clarity.



In [8]:

fig = plt.figure(figsize=(8, 8))
ax1.set_title('CCD273-84-F15 (#11263-07-01)')
ax1.plot(data['lambda'], data['T%.1fK'% newT[0]], 'mD-', label='%.1fK'% newT[0])
ax1.plot(data['lambda'], data['T%.1fK'% newT[1]], 'yo-', label='%.1fK'% newT[1])
ax1.plot(data['lambda'], data['T153K'], 'rs-', label='153K')
ax2.set_xlabel(r'$\lambda \quad$ [nm]')
ax1.set_ylabel('QE')
ax2.axhline(y=100., c='k')
ax1.fill_between([550, 900], [1.1, 1.1], color='g', alpha=0.1)
ax2.fill_between([550, 900], [200, 200], color='g', alpha=0.1)
ax2.plot(data['lambda'], data['T%.1fK'% newT[0]]/data['T153K']*100, 'mD-')
ax2.plot(data['lambda'], data['T%.1fK'% newT[1]]/data['T153K']*100, 'yo-')
ax1.set_xticks([])
ax2.set_ylabel(r'QE(x)/QE(T153K)*100')
ax1.set_xlim(330, 1080)
ax2.set_xlim(330, 1080)
ax1.set_ylim(0, 1.)
ax2.set_ylim(0.9981*100., 1.0019*100.)
plt.gca().yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
ax1.set_yticks([0.1, 0.3, 0.5, 0.7, 0.9])
plt.show()






It is obvious that the QE variations in this temperature range are rather small. We can now quantify the average and maximum deviations within the VIS bandpass.



In [9]:

def QEvariations(data, newT, limits=(550, 900)):
"""
Calcuate the average and maximum QE change within the given limits.
"""
msk = (data['lambda'] >= limits[0]) & (data['lambda'] <= limits[1])
data['low'] = data['T%.1fK'% newT[0]][msk] / data['T153K'][msk] * 100.
data['high'] = data['T%.1fK'% newT[1]][msk] / data['T153K'][msk] * 100.

low = data['low'].describe()
high = data['high'].describe()

print 'If temperature drops from 153K to %.1fK, the mean QE within the VIS band drops by ' \
'%.3f per cent' % (newT[0], 100 - low['mean'])
print 'If temperature drops from 153K to %.1fK, the maximum change of the QE within the ' \
'VIS band is %.3f per cent' % (newT[0], 100 - low['min'])
print '\n'
print 'If temperature rises from 153K to %.1fK, the mean QE within the VIS band rises by ' \
'%.3f per cent' % (newT[1], high['mean'] - 100)
print 'If temperature rises from 153K to %.1fK, the maximum change of the QE within the ' \
'VIS band is %.3f per cent' % (newT[1], high['max'] - 100)




In [10]:

QEvariations(data, newT)




If temperature drops from 153K to 152.2K, the mean QE within the VIS band drops by 0.053 per cent
If temperature drops from 153K to 152.2K, the maximum change of the QE within the VIS band is 0.199 per cent

If temperature rises from 153K to 153.8K, the mean QE within the VIS band rises by 0.053 per cent
If temperature rises from 153K to 153.8K, the maximum change of the QE within the VIS band is 0.199 per cent



## Impact on Relative Photometry

In a monthly time scale the required temperature stability of the detector cold plate is $\pm 0.8$K, while analysis imply that the stability should be close to $\pm 0.2$K. If we take the as required value, the average change in the QE will be $\sim 0.05$ per cent. If instead we use the current best estimate, derived by thermal modelling, we can expect the average QE to change by $\sim 0.01$ per cent.

# Conclusions

The expected monthly temperature variations and thus induced quantum efficiency changes should not lead to relative photometric changes that are larger than $\sim \pm 0.01$ per cent. For budgeting reasons we may wish to consider the as required thermal stability, which should lead to mean QE variation that is less than $\sim \pm 0.06$ per cent.

It should be noted however that in reality also the responsivity of the CCD amplifier (and the readout electronics) will change as a function of temperature. Thus, the photometric error will be related to the net effect of changing QE and changing responsivity of the amplifier. The later effect dominates at shorter wavelengths, while in the red, it will compensate some of the QE variation (Verhoeve, private comm.).