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

вторник, 10 декабря 2013 г.

Проблемы, с которыми я столкнулся при компиляции нового Geant4 10.0

Новая версия замечательной библиотеки Geant4 вышла 6 декабря. Я решил написать данную статью, так как встретился с одним интересным багом, который не давал скомпилировать новый Geant4. Баг связан не с самой библиотекой Geant4, и даже не с cmake, а с компилятором moc из Qt4.

Итак, последние версии Geant4 компилируются исключительно с помощью cmake. Для этого создается новая директория, например geant4.10.00-build/, и в ней запускается cmake. Я обычно использую псевдографическую оболочку ccmake (см. здесь) или обычный консольный cmake в интерактивном режиме (с опцией -i) - это позволяет включить различные опции, выключенные по умолчанию. Так, для своих нужд я обычно включаю опции GEANT4_USE_GDML, GEANT4_USE_OPENGL_X11 и GEANT4_USE_QT. Кроме того, в версии Geant4 10.0 появилась возможность включить многопоточную обработку событий при компиляции библиотеки с опцией GEANT4_BUILD_MULTITHREADED: ее включение позволит протестировать эту новую киллер-фичу.

По завершении конфигурирования билда cmake запускаем обычный make. Ждем окончания компиляции, если повезет... Мне не повезло. Когда статус достиг 84%, она прервалась с таким сообщением об ошибке:
[ 84%] Generating basic/include/moc_G4UIQt.cxx
moc: Cannot open options file specified with @
Usage: moc [options] <header-file>
  -o<file>           write output to file rather than stdout
  -I<dir>            add dir to the include path for header files
  -E                 preprocess only; do not generate meta object code
  -D<macro>[=<def>]  define macro, with optional definition
  -U<macro>          undefine macro
  -i                 do not generate an #include statement
  -p<path>           path prefix for included file
  -f[<file>]         force #include, optional file name
  -nn                do not display notes
  -nw                do not display warnings
  @<file>            read additional options from file
  -v                 display version of moc
make[2]: *** [source/interfaces/basic/include/moc_G4UIQt.cxx] Ошибка 1
make[1]: *** [source/interfaces/CMakeFiles/G4interfaces.dir/all] Ошибка 2
make: *** [all] Ошибка 2
Это и есть тот самый интересный баг, который я анонсировал в начале статьи. Для его воспроизведения требуется стечение нескольких обстоятельств: Geant4 должен компилироваться с поддержкой Qt, мажорная версия Qt не должна быть выше 4 (на моей Fedora 19 установлена Qt4 8.5) и в полном пути к директории, из которой выполняется cmake, должны присутствовать нелатинские символы (у меня эта директория находилась в $HOME/Загрузки/). Выяснилось, что во всем виноват компилятор moc, который ошибочно обрабатывает опцию @<file>, если в ней присутствуют нелатинские символы. В этом багрепорте описана проблема. Оказалось, что она уже решена в Qt5 и, поскольку ее проявления должны быть весьма редкими, то чинить ее в Qt4 нет смысла. Что же делать, если вас постигла такая неудача? Да просто строить билд Geant4 в директории, в пути к которой нет нелатинских символов!

После успешного завершения компиляции выполняем make install, переходим в директорию, куда были установлены данные (она задается переменной cmake GEANT4_INSTALL_DATADIR), и проверяем все ли они на месте: у меня почему-то не оказалось данных в поддиректориях G4PII1.3, G4SAIDDATA1.1 и RealSurface1.0, и из-за этого уже скомпилированное и запущенное приложение упало при запуске первого же события. В случае отсутствия данных в поддиректориях скачиваем их отсюда (из раздела Data Files) и устанавливаем вручную.

Теперь о настройках среды. Я уже рассказывал об этом здесь. Но, поскольку в новой версии Geant4 использование простого Makefile больше не поддерживается, то и сорсинг geant4make.sh больше не нужен. Соответственно, в $HOME/.bash_profile теперь помещаем такие строки:
export G4ROOT=/usr/local/geant4
export G4CONFIGDIR=$G4ROOT/lib64/Geant4-10.0.0
export G4WORKDIR=$HOME/geant4

[ -f $G4ROOT/bin/geant4.sh ] && . $G4ROOT/bin/geant4.sh

PATH=$PATH:$G4WORKDIR/bin
Для компиляции приложений, которые используют Geant4, нужно использовать cmake. Создаем отдельную директорию, переходим в нее и конфигурируем билд:
cmake -DCMAKE_INSTALL_PREFIX:PATH=$G4WORKDIR -DGeant4_DIR=$G4CONFIGDIR <path-to-srcs>
Здесь <path-to-srcs> - это директория с исходниками приложения. В принципе, билд можно сконфигурировать прямо внутри этой директории и аргумент cmake <path-to-src> в этом случае не нужен, однако это замусорит директорию с исходниками, поэтому такой подход обычно не рекомендуют. После успешной конфигурации запускаем make и, если нужно, make install.

Еще одна проблема, с которой я столкнулся при компиляции своего приложения - это огромное количество предупреждений о перекрытии (shadowing) имен. Дело в том, что в новой версии Geant4 в скрипты cmake была добавлена опция компилятора -Wshadow, которая выдает предупреждения, если, например, имена формальных параметров конструкторов класса и их членов совпадают. Я писал об этом здесь. Проблема в том, что такой уж у меня стиль: я всегда именую формальные параметры конструкторов и члены класса, которые они инициализируют, одинаково. Такой подход полностью противоречит модели, в которой перекрытия имен не дозволяются. Как быть? Ведь я не собираюсь переименовывать огромное количество членов всевозможных классов в своем проекте только для того, чтобы убрать эти предупреждения. Оказывается, их легко подавить, если вставить в файл CMakeLists.txt строку
add_definitions(-Wno-shadow)
где-нибудь внизу после включения ${Geant4_USE_FILE}. В этом случае противоположная опции -Wshadow опция -Wno-shadow победит исходно установленную -Wshadow и предупреждения уйдут.

воскресенье, 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 графических примитива: подсветка центральных кристаллов детекторов, вспомогательные радиальные линии, которые могут быть размещены на графической сцене в любом количестве под разными углами относительно центра мишени, маркер центра мишени.


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