Skip to content
Snippets Groups Projects
Commit 71ad1331 authored by Ralf Kliemt's avatar Ralf Kliemt Committed by Florian Uhlig
Browse files

Jupyter kernelspec files

Add generation of Jupyter kernelspec files to support Root & CbmRoot classes in Python3.
Generation is performed by cmake and the files are placed at <build/install>/share/jupyter/.
Some documentation is provided in docs/jupyter.
parent b9aa2250
No related branches found
No related tags found
1 merge request!1870Jupyter kernelspec files
Pipeline #30467 passed
......@@ -71,6 +71,8 @@ include(FairMacros)
include(WriteConfigFile)
include(CheckCompiler)
include(WriteGeant4Data_jupy)
include(WriteKernelFile)
# Do some basic checks
# out-of-source build, unix system and
......@@ -82,6 +84,9 @@ list(PREPEND CMAKE_PREFIX_PATH ${SIMPATH})
unset(packages)
find_package(Python3)
MESSAGE("Python3_EXECUTABLE=${Python3_EXECUTABLE}")
#Searches for ROOT Package
find_package(ROOT 6.22 CONFIG REQUIRED)
if(ROOT_FOUND)
......
macro(generate_config_files)
# generate config files used for build directory
WRITE_CONFIG_FILE(config.sh)
WRITE_CONFIG_FILE(config.csh)
WRITE_KERNEL_FILE(CbmRootPy/kernel.json)
# generate config files used for installation directory
SET(ROOT_INCLUDE_PATH
......@@ -20,6 +20,7 @@ macro(generate_config_files)
WRITE_CONFIG_FILE(config.sh_install)
WRITE_CONFIG_FILE(config.csh_install)
WRITE_KERNEL_FILE(CbmRootPy/kernel.json_install)
Install(FILES ${CMAKE_BINARY_DIR}/config.sh_install
DESTINATION bin
......@@ -34,5 +35,4 @@ macro(generate_config_files)
DESTINATION bin
RENAME CbmRootConfig.csh
)
endmacro()
MACRO(Write_Geant4Data_Variables_jupy)
Set(Geant4Data_Variables_jupy "")
foreach(DATASET ${Geant4_DATASETS})
string(CONCAT Geant4Data_Variables_jupy ${Geant4Data_Variables_jupy} " \"${Geant4_DATASET_${DATASET}_ENVVAR}\": \"${Geant4_DATASET_${DATASET}_PATH}\",\n")
endforeach()
ENDMACRO()
################################################################################
# Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH #
# #
# This software is distributed under the terms of the #
# GNU Lesser General Public Licence (LGPL) version 3, #
# copied verbatim in the file "LICENSE" #
################################################################################
MACRO (WRITE_KERNEL_FILE filename)
#MESSAGE("
# Python3_FOUND=${Python3_FOUND}
# Python3_Interpreter_FOUND=${Python3_Interpreter_FOUND}
# Python3_EXECUTABLE=${Python3_EXECUTABLE}
# "
#)
String(REGEX REPLACE "^.*(install).*$" "\\1" INSTALL_VERSION ${filename})
String(COMPARE EQUAL "install" "${INSTALL_VERSION}" INSTALL_TRUE)
List(REMOVE_ITEM LD_LIBRARY_PATH ${CMAKE_BINARY_DIR}/lib)
If (INSTALL_TRUE)
SET(_INSTALLDIR ${CMAKE_INSTALL_PREFIX})
SET(_BINDIR ${CMAKE_INSTALL_PREFIX}/bin)
#SET(VMCWORKDIR ${CMAKE_INSTALL_PREFIX}/share/fairbase)
SET(FAIRLIBDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
SET(_LD_LIBRARY_PATH ${FAIRLIBDIR} ${LD_LIBRARY_PATH})
Else (INSTALL_TRUE)
SET(_INSTALLDIR ${CMAKE_BINARY_DIR})
SET(_BINDIR ${CMAKE_BINARY_DIR})
#SET(VMCWORKDIR ${CMAKE_SOURCE_DIR})
SET(FAIRLIBDIR ${CMAKE_BINARY_DIR}/lib)
SET(_LD_LIBRARY_PATH ${FAIRLIBDIR} ${LD_LIBRARY_PATH})
EndIf (INSTALL_TRUE)
If(NOT DEFINED FULL_CONFIG_FILE)
Set(FULL_CONFIG_FILE "true")
EndIf(NOT DEFINED FULL_CONFIG_FILE)
IF(CMAKE_SYSTEM_NAME MATCHES Linux)
IF(FAIRROOTPATH)
configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/check_system.sh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.sh
)
configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/check_system.csh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.csh
)
ELSE(FAIRROOTPATH)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system.sh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.sh
)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system.csh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.csh
)
ENDIF(FAIRROOTPATH)
EXECUTE_PROCESS(COMMAND lsb_release -sd
OUTPUT_VARIABLE _linux_flavour
OUTPUT_STRIP_TRAILING_WHITESPACE
)
IF(_linux_flavour)
STRING(REGEX REPLACE "^\"" "" _linux_flavour ${_linux_flavour})
STRING(REGEX REPLACE "\"$" "" _linux_flavour ${_linux_flavour})
ENDIF(_linux_flavour)
EXECUTE_PROCESS(COMMAND uname -m
OUTPUT_VARIABLE _system
OUTPUT_STRIP_TRAILING_WHITESPACE
)
ElseIf(CMAKE_SYSTEM_NAME MATCHES Darwin)
IF(FAIRROOTPATH)
configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/check_system_mac.sh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.sh
)
configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/check_system_mac.csh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.csh
)
ELSE(FAIRROOTPATH)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system_mac.sh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.sh
)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system_mac.csh.in
${CMAKE_CURRENT_BINARY_DIR}/check_system.csh
)
ENDIF(FAIRROOTPATH)
EXECUTE_PROCESS(COMMAND uname -sr
OUTPUT_VARIABLE _linux_flavour
OUTPUT_STRIP_TRAILING_WHITESPACE
)
EXECUTE_PROCESS(COMMAND uname -m
OUTPUT_VARIABLE _system
OUTPUT_STRIP_TRAILING_WHITESPACE
)
ENDIF(CMAKE_SYSTEM_NAME MATCHES Linux)
CONVERT_LIST_TO_STRING(${Geant4_INCLUDE_DIRS})
Set(Geant4_INCLUDE_DIRS ${output})
CONVERT_LIST_TO_STRING(${Geant4VMC_INCLUDE_DIRS})
Set(Geant4VMC_INCLUDE_DIRS ${output})
#CONVERT_LIST_TO_STRING(${Geant4VMC_CMAKE_INSTALL_LIBDIR})
#Set(Geant4VMC_LIBRARY_DIR ${output})
CONVERT_LIST_TO_STRING(${Geant4VMC_MACRO_DIR})
Set(Geant4VMC_MACRO_DIR ${output})
Write_Geant4Data_Variables_jupy()
CONVERT_LIST_TO_STRING(${PYTHIA6_LIBRARY_DIR})
Set(PYTHIA6_LIBRARY_DIR ${output})
CONVERT_LIST_TO_STRING(${Geant3_SYSTEM_DIR})
Set(G3SYS ${output})
CONVERT_LIST_TO_STRING(${Geant3_INCLUDE_DIRS})
Set(Geant3_INCLUDE_DIRS ${output})
CONVERT_LIST_TO_STRING(${Geant3_LIBRARY_DIR})
Set(Geant3_LIBRARY_DIR ${output})
CONVERT_LIST_TO_STRING(${Geant3_LIBRARIES})
Set(Geant3_LIBRARIES ${output})
CONVERT_LIST_TO_STRING(${ROOT_LIBRARY_DIR})
Set(ROOT_LIBRARY_DIR ${output})
CONVERT_LIST_TO_STRING(${ROOT_LIBRARIES})
Set(ROOT_LIBRARIES ${output})
CONVERT_LIST_TO_STRING(${ROOT_INCLUDE_DIR})
Set(ROOT_INCLUDE_DIR ${output} )
#Set(VMCWORKDIR ${C})
Set(FAIRLIBDIR ${FAIRLIBDIR})
List(APPEND _LD_LIBRARY_PATH ${PYTHIA6_LIBRARY_DIR} ${Geant3_LIBRARY_DIR} ${Geant4VMC_LIBRARY_DIR})
List(REMOVE_DUPLICATES _LD_LIBRARY_PATH)
CONVERT_LIST_TO_STRING(${_LD_LIBRARY_PATH})
IF(CMAKE_SYSTEM_NAME MATCHES Linux)
Set(MY_LD_LIBRARY_PATH ${output})
ELSE(CMAKE_SYSTEM_NAME MATCHES Linux)
IF(CMAKE_SYSTEM_NAME MATCHES Darwin)
Set(MY_DYLD_LIBRARY_PATH ${output})
ENDIF(CMAKE_SYSTEM_NAME MATCHES Darwin)
ENDIF(CMAKE_SYSTEM_NAME MATCHES Linux)
Set(USE_VGM 1)
SET(PYTHONPATH ${CMAKE_SOURCE_DIR}/python ${FAIRLIBDIR} ${SIMPATH}/lib ${SIMPATH}/lib/root ${SIMPATH}/lib/Geant4 ${SIMPATH}/lib/g4py ${PYTHONPATH})
UNIQUE(PYTHONPATH "${PYTHONPATH}")
CONVERT_LIST_TO_STRING(${PYTHONPATH})
SET(MY_PYTHONPATH ${output})
SET (PATH ${ROOTSYS}/bin ${PATH})
UNIQUE(PATH "${PATH}")
CONVERT_LIST_TO_STRING(${PATH})
Set(MY_PATH ${output})
# If(FAIRSOFT_EXTERN)
# Set(PYTHIA8DATA "${SIMPATH}/share/pythia8/xmldoc")
# Else(FAIRSOFT_EXTERN)
# Set(PYTHIA8DATA "${SIMPATH}/generators/pythia8/xmldoc")
# EndIf(FAIRSOFT_EXTERN)
CONVERT_LIST_TO_STRING(${ROOT_INCLUDE_PATH})
Set(ROOT_INCLUDE_PATH ${output})
IF(${filename} MATCHES "[.]json.*$")
MESSAGE("Configuring Jupyter kernelspec file ${filename}")
String(REPLACE "_install" "" KERNELFILE ${filename})
configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/jupyter/${KERNELFILE}.in
${CMAKE_CURRENT_BINARY_DIR}/share/jupyter/kernels/${filename}
)
get_filename_component(KERNELSUBPATH ${KERNELFILE} DIRECTORY)
file(COPY ${CMAKE_SOURCE_DIR}/cmake/scripts/jupyter/logo-64x64.png
DESTINATION share/jupyter/kernels/${KERNELSUBPATH}
)
IF(${filename} MATCHES "install$")
install( FILES ${CMAKE_BINARY_DIR}/share/jupyter/kernels/${filename}
DESTINATION share/jupyter/kernels
RENAME ${KERNELFILE}
)
install( FILES ${CMAKE_SOURCE_DIR}/cmake/scripts/jupyter/logo-64x64.png
DESTINATION share/jupyter/kernels/${KERNELSUBPATH}
)
ENDIF(${filename} MATCHES "install$")
ENDIF(${filename} MATCHES "[.]json.*$")
ENDMACRO (WRITE_KERNEL_FILE)
{
"language": "python",
"display_name": "CbmRoot Python3",
"argv": [
"@Python3_EXECUTABLE@",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"env": {
"Linux_Flavour_": "@_linux_flavour@",
"System_": "@_system@",
"SIMPATH": "@SIMPATH@",
"ROOTSYS": "@ROOTSYS@",
"FAIRROOTPATH": "@FAIRROOTPATH@",
"Geant4_INCLUDE_DIRS": "@Geant4_INCLUDE_DIRS@",
"Geant4VMC_INCLUDE_DIRS": "@Geant4VMC_INCLUDE_DIRS@",
"Geant4VMC_LIBRARY_DIR": "@Geant4VMC_LIBRARY_DIR@",
"Geant4VMC_MACRO_DIR": "@Geant4VMC_MACRO_DIR@",
"PYTHIA6_LIBRARY_DIR": "@PYTHIA6_LIBRARY_DIR@",
"Geant3_INCLUDE_DIRS": "@Geant3_INCLUDE_DIRS@",
"G3SYS": "@G3SYS@",
"Geant3_LIBRARY_DIR": "@Geant3_LIBRARY_DIR@",
"USE_VGM": "1",
"PYTHIA8DATA": "@PYTHIA8DATA@",
@Geant4Data_Variables_jupy@
"ROOT_LIBRARY_DIR": "@ROOT_LIBRARY_DIR@",
"ROOT_LIBRARIES": "@ROOT_LIBRARIES@",
"ROOT_INCLUDE_DIR": "@ROOT_INCLUDE_DIR@",
"ROOT_INCLUDE_PATH": "@Geant3_INCLUDE_DIRS@:@ROOT_INCLUDE_PATH@",
"VMCWORKDIR": "@VMCWORKDIR@",
"FAIRLIBDIR": "@FAIRLIBDIR@",
"PYTHONPATH": "@MY_PYTHONPATH@",
"DYLD_LIBRARY_PATH": "@MY_DYLD_LIBRARY_PATH@:$DYLD_LIBRARY_PATH",
"LD_LIBRARY_PATH": "@MY_LD_LIBRARY_PATH@:$LD_LIBRARY_PATH",
"PATH": "@MY_PATH@:$PATH"
}
}
cmake/scripts/jupyter/logo-64x64.png

6.21 KiB

Jupyter Notebooks
=================
Jupyter Notebooks offer a large quality of life and are becoming more important with machine learning etc. Natively PandaRoot is a collection of C++ libraries which usually are collected and called through ROOT, mostly by macros.
ROOT by itself features python bindings as well as an own C++ Kernel. With the ``%%cpp`` magic it is also possible to mix C++ code into python code. See the introduction to PyROOT_.
.. _PyROOT: https://root.cern.ch/notebooks/HowTos/HowTo_ROOT-Notebooks.html
Using the Kernels without installation
######################################
It it is enough to do the following::
source <build>/config.sh -p
export JUPYTER_CONFIG_DIR=$SIMPATH/etc/root/notebook
export JUPYTER_PATH=$SIMPATH/etc/root/notebook
jupyter notebook
You now can use ROOT and CbmRoot classes in the Python3 kernel or the RootC++ kernel. Here are two example notebooks to start off with.
Examples
########
- <source>/docs/jupyter/notebooks/CbmRoot.ipynb
Install the Kernel
##################
In some cases it is beneficial to install the Kernel to automatically be used in the system. A simple 'jupyter notebook' command in a fresh shell would allow them to be used. Also VSCode with the jupyter extension would be able to spawn such notebooks inside the integrated environment.
The downside is that the Kernels are pointing to one specific installation of CbmRoot and its dependencies and managing multiple installations may become cumbersome.
As a prerequisit one has to install the metakernel package in python (``pip3 install metakernel``).
To install the Kernels simply copy the folders from ``<build>/jupyter/kernels`` to the appropriate place:
- ``~/.local/share/jupyter/kernels`` (Linux)
- ``~/Library/Jupyter/kernels`` (Mac)
- ``%APPDATA%\jupyter\kernels`` (Win)
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment