Developing #66
BeamDet идентификация частицы
Status: | Закрыта | Start date: | 07/25/2017 | |
---|---|---|---|---|
Priority: | Низкий | Due date: | ||
Assignee: | Mikhail Kozlov | % Done: | 0% | |
Category: | BeamDet | |||
Target version: | v-0.4 |
Description
Необходимо разработать класс ERBeamDetPID(particle identification) для идентификации парамеров частицы, летящей в BeamDet.
Результатом работы будет один объект типа ERBeamDetParticle - fProjectile.
Компонентами ERBeamDetParticle являются 4-x вектор ее состояния (TLorentzVector),PDG код,probability - вероятность того, что мы угодали частицу правильно.
PDG и probability:
Пользователь подразумевает какую частицу(ион) он должен регистрировать, поэтому PDG код необходимо сделать интерфейсом.
Для идентификации частицы используется tof и dE в TOF.
tof - время пролета между пластиками, dE - суммарная энергия оставшаяся на них.
Для задания отбора по этим параметрам необходимо сделать интерфейс: SetBoxPID(tof1,dE1,tof2,dE2). Probability=1, когда tof между tof1, tof2, dE между dE1 и dE2, если не попало в границе probability = 0
В дальнейшем понадобится такой же отбор, но с заданием границ как эллипс.
Нужно сделать интерфейс probability threshold. Если probability получилось ниже, чем probability threshold, то писать event в выходной файл не нужно по умолчанию равен нулю.
TLorentzVector состояния на мишени
Мы определяем Энергию иона по времени пролета:
1)tof = tof1-tof2 + tof_offset
tof_offset - каллибровочный параметр. Задается пользователем, нужен интерфейс.
2)Высчитываем beta фактор иона
beta = расстояние между tof(из BeamDetSetup)/tof/C (C - скорость света)
3) делаем отбор событий на абсурдность. Если не прошли - не пишем в файл.
beta между 0 и 1
4) Считаем гамма фактор и модуль импульса
gamma= 1./sqrt(1.-beta*beta);
p= beta*Mprojectile*gamma; (Mprojectile из TDatabasePDG и знания PDG)
5) По имульсу и знания направления на мишени формируем TLorentzVector состояни на мишени и сам объект fProjectile(выходной объект таска в этом событии)
Px = p*sin(theta)*cos(phi)
Py = p*sin(theta)*sin(phi)
Pz = p*cos(theta)
E = гуглим как из импульса и массы получить полную энергию
History
#1 Updated by Mikhail Kozlov over 7 years ago
Как определять вероятность, отличную от единицы, если не попадаем в промежутки по tof или dE?
#2 Updated by Mikhail Kozlov over 7 years ago
2) Что такое объект fProjectile?
#3 Updated by Vitaliy Schetinin over 7 years ago
- Description updated (diff)
#4 Updated by Mikhail Kozlov over 7 years ago
Вопросы про объекты отпали, до меня дошло.
А вот про вероятность до сих по не понял. Если она нулевая при непопадании в границы, то зачем интерфейс на порог по вероятности.
#5 Updated by Vitaliy Schetinin over 7 years ago
Она либо 1, либо 0. Более сложные вещи будем потом имплементировать. Если попали в заданную область значения - 1, если нет, то 0
#6 Updated by Mikhail Kozlov over 7 years ago
Для идентификации нужны данные и с этапа диджитизации для dE и tof, а и с этапа определения параметров трека для получения вектора импульса.
Как одновременно в симуляции получить и то и другое?
#7 Updated by Vitaliy Schetinin over 7 years ago
Не совсем понял, что значит в симуляции. Но на этапе FairTask досутупны все ветки, которые были во входных файлах (основном можно ще дополнительные добавлять. AddFriend()) и во всех предыдущих задачах. Через ioman
#8 Updated by Mikhail Kozlov over 7 years ago
Оговорка, хотел написать в макросе вместо симуляции.
#9 Updated by Mikhail Kozlov over 7 years ago
В ioman есть только приватный метод AddFriends().
Сейчас делаю fRun->AddFriend("reco.root"), но у меня падает программа на моменте получения значения угла из объекта трека.
Не могу понять с чем связано. То ли неправильно считывается объект из дерева, то ли просто напутал со ссылками и указателями при вытаскивании данных из объекта fBeamdetTrack.
#10 Updated by Vitaliy Schetinin over 7 years ago
Во первых проблема была не втом, что ты не правильно работаешь с фалами, а то , что таск BeamDetPID ожидает, что объект BeamDetTrack был создан. Но это происходит не всегда.
Тут на самом деле вскрылась довольно большая проблема, которая заключается в том, что мы не можем прекратить выполнение PipeLine из какого либо таска. Сейчас отбор событий у нас происходит с помощью MarkFill(kFALSE), который говорит не писать событие в выходной файл. Но при этом все последующие таски в ране будут выполняться. Это порочно, потому что в следующих тасках мы должны спрашивать был ли создан такой то объект. При этом мы даже не можем на текущий момент опросить состояние флага, который ставится с помощью MarkFill(kFALSE), просто нет такого интерфейса.
Данная ситуация видимо создана по причине того, что FairRoot предпологает, что отбор событий был совершен на этапе дака. Такой вывод я сделал, потому что cbmroot и r3broot не используют MarkFill. То есть у них количество событий на входе всегда равно количеству событий на выходе. Наша действительность немного другая и отбор событий происходит уже в анализе.
На данный момент я просто добавил в ERBeamDetPID проверку на существование объекта ERBeamTrack и все перестало падать. Кроме того, я добавил пример макроса с AddFriend.
Я вижу два пути развития событий:
1) Я ошибаюсь на счет FairRoot и все таки найдется нативный способ остановки pipeline и перехода к следующему событию. Решается написанием письма Радеку
2) Я перегружу менеджеры FairRunAna. Будет ERRunAna, который умеет останавливать PipeLine и переходить к следующему событию.
#11 Updated by Mikhail Kozlov over 7 years ago
Если у нас несколько тасков в одном макросе, то у нас событие обрабатывается всеми тасками, а потом осуществляется переход к следующему событию - правильно, а не так, что сначала прогоняется вся диджитизация, потом поиск трека и т.д?
#12 Updated by Vitaliy Schetinin over 7 years ago
Да. Сначала обрабатывается всеми тасками
#13 Updated by Mikhail Kozlov over 7 years ago
У меня неправильно было задано имя BeamDetTrack в ioman в классе ERBeamDetPID! Сейчас нормально все работает и без проверки существования объекта.
#14 Updated by Vitaliy Schetinin over 7 years ago
Ну это проблемы не решает. Буду писать свой ран менеджер с блэкджеком.
Я попробовал использовать G4IonTable как калькулятор массы иона по разным наборам параметров. И понял, что это не возможно, потому что Geant оже хочет инициализации кучи своих объектов. Так что вывод простой. На этапе реконструкции пользователь сам задает все необходимое для идентификации. В данном случае надо просто добавить интерфейс для ввода массы.
#15 Updated by Mikhail Kozlov over 7 years ago
Каким образом гарантировать, что масса пользовательского иона равна в симуляции и реконструкции?
#16 Updated by Vitaliy Schetinin over 7 years ago
Только разумностью пользователя
#17 Updated by Mikhail Kozlov over 7 years ago
Как можно в одном дереве получить результаты и симуляции и реконструкции? Чтобы можно было в TreeViewer проверить качество восстановления координаты на мишени.
#18 Updated by Vitaliy Schetinin over 7 years ago
- Status changed from Открыта to Закрыта