Показаны сообщения с ярлыком ChargeExchangeMC. Показать все сообщения
Показаны сообщения с ярлыком ChargeExchangeMC. Показать все сообщения

воскресенье, 22 декабря 2013 г.

Интеграция гистограмм CERN ROOT в Qt GUI Geant4

Собственно, возможность открывать гистограммы из GUI Geant4 я прикрутил уже давно. Реализацию кооперации ROOT и Geant4 можно найти в исходном коде ChargeExchangeMC, который поставляется вместе с Geant4 как один из advanced examples. Эта реализация основана на использовании бэкенда Qt CERN ROOT, поэтому она доступна только при использовании плагина визуализации Qt Geant4.

Базовая реализация интеграции гистограмм в ChargeExchangeMC (входящая в состав последней версии Geant4) была основана исключительно на вводе пользователем команд в командной строке Geant4. Но недавно я подумал, а почему бы не создать специальное меню, в котором будут перечислены все имеющиеся гистограммы в естественном древовидном порядке. При клике на имени гистограммы в меню она будет отображаться в канвасе: это намного проще и естественнее, чем набирать вручную команду листинга гистограмм, затем выбирать из полученного списка нужную гистограмму и вводить новую команду для ее отображения.

На следующей картинке изображена сессия Qt Geant4 c одной из гистограмм, изображающей пучок, прошедший сквозь входной мониторный счетчик. Гистограмма была открыта из меню Histo, находящемся в верхней левой части окна справа от меню Viewer. Все картинки ниже кликабельны.


А это меню Histo в развернутом виде:


Одна из поддиректорий развернута, внутри нее находятся десять гистограмм. Для удобства восприятия перед именами двух- и трехмерных гистограмм стоят соответствующие значки 2: и 3:.

Самой главной технической сложностью здесь было построение подменю. Интерфейсы GUI Geant4 их просто не поддерживают. Один из вариантов реализации поддержки подменю - субклассинг G4UIQt - мне не понравился, так как из пушки по воробьям. В итоге я решил добавить новую функцию AddSubmenu() прямо в класс CexmcHistoManager. Вот реализация функции BuildMenuTree(), которая рекурсивно строит меню гистограмм, и функции AddSubmenu():
void  CexmcHistoManager::BuildMenuTree( G4UIQt *  session,
                                        const G4String &  menu, TList *  ls )
{
    TIter      objs( ls );
    TObject *  obj( NULL );

    while ( ( obj = ( TObject * )objs() ) )
    {
        G4String  name( obj->GetName() );
        G4String  title( obj->GetTitle() );

        if ( obj->IsFolder() )
        {
            AddSubmenu( session, menu, name, title );
            BuildMenuTree( session, name, ( ( TDirectory * )obj )->GetList() );
        }
        else
        {
            G4String  options( name );

            do
            {
                if ( obj->InheritsFrom( TH3::Class() ) &&
                     ! drawOptions3D.empty() )
                {
                    title = G4String( "3: " ) + title;
                    options += G4String( " " ) + drawOptions3D;
                    break;
                }
                if ( obj->InheritsFrom( TH2::Class() ) &&
                     ! drawOptions2D.empty() )
                {
                    title = G4String( "2: " ) + title;
                    options += G4String( " " ) + drawOptions2D;
                    break;
                }
                if ( obj->InheritsFrom( TH1::Class() ) &&
                     ! drawOptions1D.empty() )
                {
                    options += G4String( " " ) + drawOptions1D;
                    break;
                }
            } while ( false );

            G4String  cmd( CexmcMessenger::histoDirName + "draw " + options );
            session->AddButton( menu, title.c_str(), cmd );
        }
    }
}

void  CexmcHistoManager::AddSubmenu( G4UIQt *  session,
                                     const G4String &  parent,
                                     const G4String &  name,
                                     const G4String &  label )
{
  QMenu *  menu( new QMenu( label.c_str() ) );
  QMenu *  parentMenu( ( QMenu * )session->GetInteractor( parent ) );

  parentMenu->addMenu( menu );
  session->AddInteractor( name, ( G4Interactor )menu );
}
Предполагается, что BuildMenuTree() будет вызвана в момент инициализации менеджера гистограмм примерно таким образом:
    G4UIQt *  qtSession( dynamic_cast< G4UIQt * >( session ) );

    if ( qtSession )
    {
        qtSession->AddMenu( histoMenuHandle, histoMenuLabel );
        BuildMenuTree( qtSession, histoMenuHandle, gDirectory->GetList() );
    }
Здесь session - указатель на объект типа G4UIsession, histoMenuHandle и histoMenuLabel - строки, первая задается произвольно - это дескриптор нового главного меню в строке меню (menu bar), вторая - имя этого меню, в нашем случае она равна Histo.

Этого кода еще нет в составе ChargeExchangeMC, но я думаю добавить его к следующему релизу Geant4.

воскресенье, 4 декабря 2011 г.

Вышел Geant4 9.5

Вышла новая версия Geant4 - программы для моделирования физических процессов в веществе. Чейнджлог здесь. В новой версии было решено отказаться от скрипта Configure при конфигурации билда, вместо этого настройка всех параметров производится с помощью cmake. Подробное руководство по настройке и компиляции Geant4 можно найти в файле cmake/INSTALL.g4cmake после распаковки тарбола с исходниками. Поскольку во время построения Geant4 я столкнулся с проблемами, то изложу все подробности здесь.

Итак, сначала, в соответствии с инструкциями руководства, создаем новую директорию geant4.9.5-builld/ на том же уровне файловой иерархии, что и корневая директория распакованных исходников (хотя конкретные название и местоположение новой директории не имеют особого значения). После этого переходим в эту директорию. Теперь следует сконфигурировать билд с помощью cmake. Я использовал для этого стандартную псевдографическую оболочку ccmake - в ней удобней настраивать параметры билда:
ccmake ../geant4.9.5
В открывшемся окне выбираем те параметры, которые следует изменить. Клавиша Enter позволяет переключать toggle-параметры и переводит в режим редактирования строковые параметры. В частности, я изменил значение CMAKE_INSTALL_PREFIX с /usr/local на /usr/local/geant4, кроме того, я установил параметры GEANT4_INSTALL_DATA, GEANT4_USE_GDML, GEANT4_USE_OPENGL_X11 и GEANT4_USE_QT в ON. Второй параметр в этом списке нужен для компиляции модуля GDML, а последние два - для компиляции модулей OpenGL и Qt. Забегая вперед отмечу, что GDML будет нужен для компиляции одного из advanced examples - ChargeExchangeMC  (GDML используется в нем для описания геометрии физической установки), а OpenGL и Qt нужны для качественной визуализации установки и частиц (картинка, приведенная ниже, создана с помощью драйвера визуализации OpenGL/Qt). После настройки всех параметров жмем на клавишу с и ждем, пока cmake сконфигурирует билд. Если в процессе конфигурации не возникло ошибок, то в нижнем окне ccmake появится подсказка Press [g] to generate and exit. Далее жмем на g, а после выхода из ccmake запускаем make и make install.

Все, Geant4 построен и установлен. Теперь нужно сделать так, чтобы конфигурация Geant4 (переменные среды и т.п.) автоматически настраивалась при входе в систему. Для этого необходимо, чтобы в файле $HOME/.bash_profile (если вы используете bash в качестве оболочки) сорсились файлы /usr/local/geant4/bin/geant4.sh и /usr/local/geant4/share/Geant4-9.5.0/geant4make/geant4make.sh. И здесь возникает первая проблема: из-за бага в исходном коде Geant4, файл /usr/local/geant4/bin/geant4.sh содержит мусор в shebang-строке (самой первой строке скрипта). Соответственно
#!@GEANT4_TC_SHELL_PROGRAM
следует заменить на
#!/bin/sh
В файл $HOME/.bash_profile помещаем следующие строки:
export G4ROOT=/usr/local/geant4
export G4ROOTMAKE=$G4ROOT/share/Geant4-9.5.0/geant4make
export G4WORKDIR=$HOME/geant4

[ -f $G4ROOT/bin/geant4.sh ] && . $G4ROOT/bin/geant4.sh
[ -f $G4ROOTMAKE/geant4make.sh ] && . $G4ROOTMAKE/geant4make.sh
Вторая проблема заключается в том, что в файле /usr/local/geant4/share/Geant4-9.5.0/geant4make/geant4make.sh настраивается переменная среды LD_LIBRARY_PATH, но почему-то не настраивается PATH, а эта переменная нужна для поиска пользовательских программ и скомпилированных примеров из исходного кода Geant4. Поэтому ниже в $HOME/.bash_profile добавляем строку
PATH=$PATH:$G4WORKDIR/bin/$G4SYSTEM
Теперь вернемся к проекту ChargeExchangeMC, исходный код которого поставляется вместе с исходниками Geant4 в директории examples/advanced/ChargeExchangeMC. Эта программа использовалась для моделирования отклика детекторов в реальных физических экспериментах по изучению реакции пион-нуклонной перезарядки. Однако, программа может быть легко адаптирована для изучения фактически любых адронных реакций  на почти произвольных физических установках (так, геометрия установки описывается в формате GDML и ее легко изменять без перекомпиляции программы). Подробности здесь.

В обновленной версии ChargeExchangeMC проведена серьезная работа по улучшению производительности программы, в частности, значительно оптимизирован расчет физических величин, исправлены ошибки, добавлены новые алгоритмы реконструкции событий. Одна из важных новинок - специализированный фреймворк для создания и отображения произвольных графических примитивов (scene primitives). Фреймворк основан на run-duration модели G4VModel. В рамках этого фреймворка реализованы 3 графических примитива: подсветка центральных кристаллов детекторов, вспомогательные радиальные линии, которые могут быть размещены на графической сцене в любом количестве под разными углами относительно центра мишени, маркер центра мишени.


На картинке представлено одно разыгранное событие: пи-мезон, падающий справа на мишень (красная линия), нейтрон, вылетающий из мишени (темно-зеленая линия) и два гамма-кванта, также вылетающие из мишени и образующие внутри кристаллов детекторов гамма-ливни (голубые линии). Кроме того, на картинке присутствуют маркер центра мишени (оранжевая точка), четыре вспомогательные радиальные линии (вишневого цвета), исходящие из центра мишени, и подсветка центральных кристаллов детекторов (желтого цвета).

воскресенье, 19 декабря 2010 г.

Вышел Geant4 9.4 и ChargeExchangeMC (aka Cexmc)

17 декабря вышла новая версия библиотеки для моделирования прохождения элементарных частиц в веществе Geant4 9.4. Geant4 широко применяется при моделировании физических экспериментов, а также в медицине и космофизике.
Для меня данный релиз замечателен тем, что в него в качестве одного из advanced examples вошла программа ChargeExchangeMC, автором которой я являюсь. Программа применялась для моделирования реального эксперимента в Петербургском Институте Ядерной Физики. Первая версия, написанная на фортране, была в дальнейшем переписана с нуля на C++ с использованием Geant4.
Основные особенности программы:
  1. Это достаточно большой проект, он включает 71 заголовочный файл и 63 файла исходников, общий размер программного кода превышает 20 тысяч строк
  2. Геометрия установки полностью описана в формате GDML. Это позволит гибко изменять описание установки без изменения исходного кода
  3. Для упрощения анализа данных используются гистограммы на основе библиотеки CERN ROOT
  4. Реализована модель реконструкции данных с гибкой настройкой различных параметров
  5. В программе реализован гибкий алгоритм на основе шаблонов C++ для возможности легкого изменения изучаемых взаимодействий
  6. Персистентное хранение данных реализовано с помощью библиотеки boost::serialization
  7. Пользовательский фильтр данных позволяет изменять полученные данные с помощью специальных скриптов. Грамматика скриптов описана с помощью библиотеки boost::spirit
  8. Run manager имеет уникальный режим проигрывания событий (replay mode), который позволяет пересчитывать уже имеющиеся данные с параметрами, отличными от исходных
Документацию по установке и использованию программы можно найти здесь.