There are a number of required programs and tools you must have installed on your system to build and run hps-mc.
- wget
- git
- gcc >= 4.8
- CMake >= 3.18
- Maven >= 3.0
- python >= 3.6
- Java =1.8
- GSL =1.16
Most of these dependencies can be installed on Ubuntu using:
sudo apt-get install build-essential maven gfortran cmake python3 libgsl-dev git wget
You may want to download and install the latest version of CMake instead of using the one from your package manager so that it is up to date.
A few Python libraries need to be installed as well:
pip install psutil jinja2
The slic program should be pre-installed and available in the system path.
Some scripts may also require that the DST Maker is installed and available in the system path.
You need to have CMake installed on your system as well as gcc (preferably version 4.8 or greater).
To build the project:
cd hps-mc; mkdir build; cd build
cmake -DCMAKE_INSTALL_PREFIX=../install -DGSL_ROOT_DIR=$GSL_ROOT_DIR ..
make install
The GSL_ROOT_DIR
variable should be set to the GSL installation prefix which was used when you configured it (directory should contain the directories bin, include, etc.).
To build with additional external dependencies installed automatically:
cmake -DCMAKE_INSTALL_PREFIX=$(realpath ../install) -DGSL_ROOT_DIR=/work/slac/sw/gsl/gsl-1.16-install/ -DENABLE_INSTALL_GENERATORS=ON -DENABLE_INSTALL_FIELDMAPS=ON -DENABLE_INSTALL_LCIO=ON -DENABLE_INSTALL_HPSJAVA=ON -DENABLE_INSTALL_CONDITIONS=ON ..
This should install all of the tools to hps-mc/install
.
Change CMAKE_INSTALL_PREFIX
above if you wish to install to a different directory.
Before running scripts, the environment script should be sourced.
This sources the bash environment setup script:
. hps-mc/install/bin/hps-mc-env.sh
This is the corresponding command for c-shell:
. hps-mc/install/bin/hps-mc-env.csh
The SLIC executable and DST Maker are "sold separately" so these commands should be setup in your environment.
You can check if they are available using:
which slic
which dst_maker
You should also check that typing slic
and dst_maker
executes these commands correctly.
You will want to run jobs from a scratch directory as many of components create a lot of files:
mkdir /scratch/myjob
cd /scratch/myjob
Now you can execute one of the test jobs:
python hps-mc/python/test/egs5_test.py
In the above command insert the full path to your hps-mc installation instead of hps-mc
or you can copy the python script to the scratch directory.
The source code documentation can be found here. For additional information of how to use the job scripts, refer to the examples directory and the comments in there.
The first step to setting up an system to run jobs via hps-mc is first producing ~/.hpsmc
which will set all of the system level configuration parameters for all types of jobs. An example of what a system level .hpsmc file should look like is provided at config/bravo_sdf.cfg
. One can simply copy this to ~/.hpsmc
of the system and update the paths to point to the relevant locations on that particular system.
The system level configuration file should not be confused with a job level configuration file, typcially kept in the directory used to prepare and submit the jobs. hps-mc will go looking in a few standard locations for configuration files named .hpsmc
and load any configurations in them. The local directory where the submission command is issued is the last place searched and parameters in this location will override all others, if any conflicts exist. An example of a job level configuration file is provided at config/job.cfg
as well as more in the various example jobs provided in the examples directory.
The next step of the process is to build up a jobs.json file with all of the relevant job configurations. Looking in examples/tritrig_gen
one can see a few different scripts as examples of how one can put together a jobs.json file to be used to submit/run jobs using the various available computing resources hps-mc knows how to leverage. Following the example of examples/tritrig_gen
one can navigate to this directory and inspect mkjobs.sh
to see the command for automatically generating a jobs.json configuration. The provided job.json configuration only defines a single job, and can not be used to submit jobs to a batch system and is used for local testing purposes. hps-mc-job-template
takes in a few different types of arguements to tell it how you want to generate your jobs.
Parameters one might want to iterate over in jobs can be entered into lists in vars.json, the example uses this to generate the sample with two different target positions, just to illustrate this feature. Another important arguement for hps-mc-job-template
is job.json.tmpl. This is the filename for the job template to be used to define all the parameters for one particular job. Variables provided in the vars.json file can be accessed in job.json.tmpl inside of double curly braces, and jinja2 support is available for processing the variables. An example of this feature is the seed parameter in examples/tritrig_gen
where an offset is added to job_id
(which is always an available template variable) to make a unique seed number for each job. Jinja2 is a well documented templating engine on which this part of hps-mc is based.
After one has generated a jobs.json file, the jobs it defines can be ran locally, in a pool, or submitted to one of the various batch systems it supports via hps-mc-batch
. In examples/tritrig_gen
there are a few examples of submission commands in run_pool.sh
, submit_lsf.sh
, and run_slurm.sh
. Slurm in particular will generate script to use to submit each individual job. With some small modifications one can use these to prepare a job array to submit to slurm, if one wants to use that particular feature of the Slurm system. Ultimately, hps-mc just prepares a single run command using hps-mc-job
which the batch tool knows how to prepare and call properly, given the configuration and parameters of each job, to get the job running in any of the supported run modes (local, pool, or some batch system).
It is recommended to slowly build up jobs and tests them locally first before submitting a whole set to a batch system to run. This can be with commands nearly identical to the commands used to submit the jobs to a batch system (local or pool). The system is pretty abstracted so you might even find a new clever way to leverage the features of hps-mc to speed up the process of defining job sets, or even just getting the jobs ran.
There is a github action ensuring proper formatting of python code in hps-mc
. This action will fail if the pushed code does not follow the PEP 8 style conventions.
To prevent this action from failing, you can check if your code is formatted correctly locally before pushing. This can be done using pycodestyle, by navigating to the top directory of hps-mc and running
pycodestyle --ignore=E266,E501,E121,E123,E126,E133,E226,E241,E242,E704,W503,W504,W505 --max-line-length=160 python/
which will display all formatting errors in python/
. Before running this, make sure pycodestyle is installed on your machine. If you need to install it, you can do this by running
pip install --user pycodestyle
You can automate the style check by creating a git pre-commit hook. This will automatically check all python files upon running git commit
. To add the pre-commit hook, navigate to the .git/hooks/
directory in hps-mc
, create a pre-commit hook, and make it executable. If you already have pre-commit hooks, you can skip this step.
cd .git/hooks
touch pre-commit
chmod +x pre-commit
Then, add the following lines to pre-commit
#!/bin/sh
pycodestyle --ignore=E266,E501,E121,E123,E126,E133,E226,E241,E242,E704,W503,W504,W505 --max-line-length=160 python/
To fix the formatting errors, you can either do this manually by navigating to the displayed files and making the necessary changes, or you can use autopep8 as follows. First, install autopep8:
pip install --user --upgrade autopep8
Then run
autopep8 --aggressive --aggressive --ignore=E265,E266,E501,E121,E123,E126,E133,E226,E241,E242,E704,W503,W504,W505 --in-place --max-line-length=160 --recursive python/
from the top of the hps-mc
directory. Alternatively, run format_python_code.sh
.
This will automatically fix (most) of the formatting issues.
To preserve the Doxygen-style comments, it is necessary to disable the automatic formatting of comment blocks which means that you might need to fix those by hand.
Unit tests for the hps-mc python modules can be found in python/test
.
There are several ways to run the tests. Assuming you are in python/test
, you can
- run all tests at once:
The
python3 -m unittest -v
-v
option creates a more verbose output than the standard output. If you're running the tests for the first time, you might need to run:python3 -m unittest discover -v
- run a test module:
or
python3 -m unittest -v test_some_module.py
python3 -m unittest -v test_some_module
- run a selection of test modules:
python3 -m unittest -v test_some_module test_another_module
- run a specific test class or test in a module:
python3 -m unittest -v test_some_module.TestClass.test_method
More details on the python unittest
framework can be found here.
You can post any questions or report problems on the HPS Slack in the montecarlo channel.
The HPS software mailing list can also be used for help.