Привет geektimes.
При мысли о детекторах космического излучения, первое что приходит в голову, это счетчики Гейгера, сцинтилляторы, охлаждаемые детекторы и прочая дорогая и экзотичная аппаратура. Однако как оказалось, “поймать” частицы можно гораздо проще — при помощи обычной цифровой камеры.
Как это работает, подробности под катом.
Теория
О возможности подобного детектирования я узнал совершенно случайно из статьи “CAPTURING COSMIC RAYS WITH A DIGITAL CAMERA”, опубликованной на www.cloudynights.com. Я совершенно далек от ядерной физики, так что теоретическая часть это фактически вольный перевод из той статьи.
Космические лучи — это высокоэнергетичные частицы, летящие в пространстве со скоростью, почти достигающей скорости света. Они были открыты еще в 1900х, когда было выяснено наличие ионизирующего излучения, возрастающего на больших высотах. Энергия излучения оказалась такова, что оно проникает даже через металлическую защиту. Оно было обнаружено глубоко под землей и под водой.
Как показали исследования, космическое излучение подразделяется на первичное и вторичное. Первичное — это летящие с большой скоростью протоны, ядра водорода, гелия, иногда более тяжелых элементов. Некоторые частицы имеют энергию 3*10^20 эВ, что было бы достаточно чтобы зажечь 100-ваттную лампу в течении секунды. Источниками таких частиц являются взрывы сверхновых, процессы в нейтронных звездах, галактических ядрах и черных дырах. Достигая атмосферы Земли, частицы сталкиваются с атомами и молекулами воздуха, порождая вторичное излучение. У поверхности земли оно практически полностью состоит из мюонов, частиц похожих на электроны, но имеющих гораздо большую массу. На поверхности Земли энергия мюонов составляет 4ГэВ, что позволяет им проникать на глубину до 700м.
Поток мюонов на поверхности составляет примерно 1 частицу на квадратный сантиметр в минуту (запомним это число, оно пригодится чтобы прикинуть сколько частиц пролетит через сенсор камеры). Из первичного излучения, до поверхности Земли доходит всего лишь 3% частиц.
Для нас же, наибольший интерес представляет то, что помимо традиционных способов типа счетчиков Гейгера, космическое излучение детектируется и CMOS/CCD-матрицами. К чему мы сейчас и приступим.
Практика
В процессе детектирования частиц весьма удобно то, что для этого не надо ни лететь в космос, ни даже ехать в горы. Вполне достаточно просто положить камеру на стол, предварительно закрыв крышкой объектив.
Съемка
Задача N1 — получение достаточного количества снимков. Камера в принципе подойдет любая, с возможностью ручных настроек. Очевидно, что чем больше площадь сенсора, тем больше столкновений удастся получить. Лишний свет не нужен, так что крышку объектива нужно будет закрыть. В вышеприведенной статье рекомендуются выдержки 1-3 минуты. В моем случае, имелась камера Basler ace, максимальная выдержка которой составляет всего 1с, это тоже подойдет (частицы все равно летят гораздо быстрее), единственный минус такого случая — придется обрабатывать больше кадров.
Для камеры была написана простая программа с использованием Pylon SDK, которая непрерывно делает фото, для других камер наверняка можно найти что-то аналогичное. ISO и выдержку стоит подобрать так, чтобы с одной стороны, кадр был достаточно темным, с другой стороны, чтобы чувствительность была максимально возможной.
В моем случае программа работала 4 часа, было записано 7200 кадров, каждый с выдержкой 1с. Очевидно, что максимальный поток частиц идет с неба сверху, так что камера была положена с закрытой крышкой объектива, матрицей вверх.
Обработка
Следующих шагом встает задача автоматической обработки результатов. Была написана программа на Python, которая для каждого кадра определяет максимальную яркость. Результаты работы программы выводятся в виде CSV-файла, для которого легко построить график. Таким образом, если на кадре будет яркая точка, он будет выделен среди остальных.
import time, datetime
import sys, os
import threading, subprocess
from PIL import Image
# Get all files in a folder and subfolders
def getMediaFilesList(folder):
file_paths = []
for root, directories, files in os.walk(folder):
for filename in files:
if ".jpg" in filename.lower() or ".png" in filename.lower() or ".tif" in filename.lower():
# Save full file path
filepath = os.path.join(root, filename)
file_paths.append(filepath)
return file_paths
folder = "/Users/XXXX/BaslerCam2/"
filesList = getMediaFilesList(folder)
threshold = 160
abortFlag = False
def analyzeThread(indexStart = 0, indexEnd=1):
global filesList, threshold
for index in range(indexStart, indexEnd):
filePath = filesList[index]
startTime = datetime.datetime.now()
photo = Image.open(filePath)
photo = photo.convert('RGB')
width = photo.size[0]
height = photo.size[1]
pix = photo.load()
# Get GRB values, calculate maximum brightness
BrMax = 0
for i in range(width):
for j in range(height):
R,G,B = pix[i,j]
Br = 30*R + 59*G + 11*B #R*0.3 + G*0.59 + B*0.11
if Br > BrMax: BrMax = Br
dT = (datetime.datetime.now() - startTime).total_seconds()
b = BrMax/100
if b > threshold:
print "{},{},{},{}; !!!".format(index, b, filePath, dT)
else:
print "{},{},{},{};".format(index, b, filePath, dT)
if abortFlag: break
cnt = len(filesList)
print "Analyze {} files:".format(cnt)
thread1 = threading.Thread(target=analyzeThread, kwargs=dict(indexStart=0, indexEnd=cnt))
thread1.start()
#thread2 = threading.Thread(target=analyzeThread, kwargs=dict(indexStart=cnt/3, indexEnd=2*cnt/3))
#thread2.start()
#thread3 = threading.Thread(target=analyzeThread, kwargs=dict(indexStart=2*cnt/3, indexEnd=cnt))
#thread3.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
pass
abortFlag = True
#thread3.join()
#thread2.join()
thread1.join()
print "Done"
В результате получается набор CSV-строк, примерно такого вида:
index;MaxL;name;
0,80,capture-00000.tif;
1,81,capture-00001.tif;
2,80,capture-00002.tif;
3,81,capture-00003.tif;
Файл можно сохранить и открыть например, в Excel, чтобы построить график.
Программа работает небыстро. Как можно видеть из кода, была попытка распараллелить обработку на несколько потоков, однако прироста скорости это почему-то не дало. Впрочем, скорость здесь не особо критична — время обработки несущественно по сравнению с тем временем, которое частица летела к Земле :)
Результаты
Честно говоря, вообще не верилось что что-то получится. Тем интереснее было открыть cvs в виде графика и увидеть результат. По горизонтали номер кадра, по вертикали яркость в RGB. Напоминаю, что крышка объектива была закрыта.
Четко видны пики яркости, которые явно выделяются из среднего уровня шумов матрицы. В начале также хорошо видно повышение шума из-за нагрева камеры.
Стало интересно, как регистрация частицы выглядит “вживую”. На картинках 100% кроп (неподвижные точки это шумы матрицы):
Заключение
Как можно видеть, метод действительно работает. Желающие также приглашаются попробовать и показать результаты. Вроде под Android есть даже готовые программы для смартфонов. Теоретически, может подойти и вебкамера, поток с которой можно записывать в виде файлов с помощью ffmpeg. При наличии 2х одинаковых камер, интерес представляет также размещение матриц параллельно друг другу, что позволит фиксировать направление полета частиц.
И наконец, не менее интересен сам факт, что каждую минуту через нас пролетают десятки заряженных частиц, обладающих энергией, достаточной чтобы пробить 700м земной поверхности. Как это влияет на клетки, остается только гадать. Впрочем, есть теория (и наверное небезосновательная), что именно космическая радиация является тем самым фактором, из-за которого и произошла эволюция. Так что если бы не эти частицы, некому было бы читать эту статью.
Автор: DmitrySpb79