Development¶
Git workflow¶
We use a fork-based workflow. If you are new to Git or GitHub, read the Git tutorial for SHiP first. The steps are:
- Fork ShipSoft/FairShip on GitHub.
-
Clone your fork locally:
-
Add the official repository as a remote:
-
Keep your fork up to date:
-
Create a branch for your work:
-
Push and open a pull request:
Then open a PR from your fork to
ShipSoft/FairShipon GitHub.
Commit messages¶
Commit messages follow Conventional Commits,
for example fix(veto): correct the SBT segment numbering or
docs: update the README. The commit-msg hook installed below checks
this when you commit, and CI checks it again on the pull request.
- Keep the summary line short (< 72 characters).
- Optionally add a blank line followed by a more detailed explanation.
- Code must at least compile before you open a PR.
- Add an entry to the
Unreleasedsection ofCHANGELOG.mdfor any change users or developers will notice. The pull request template asks for it.
Linting and git hooks¶
FairShip runs its linters through prek
with the tools from the pixi lint environment: ruff, clang-format,
cpplint, codespell, pyupgrade, mypy, reuse, gersemi, yamlfmt and
commitizen. Install the hooks once per clone and run them on the whole
tree with:
See Linting & git hooks for details.
AI-assisted contributions¶
AI-assisted contributions are welcome under the rules in
AI_POLICY.md.
In short: say which tool or model you used, review and understand
everything you submit, and answer reviewers yourself. AI tools cannot be
co-authors; credit them with a trailer instead:
C++ guidelines¶
The FairShip wiki has the full C++ guidelines. See also the C++ Core Guidelines.
General¶
- NEVER use
using namespacein headers. - Prefer
static_cast,dynamic_cast, orreinterpret_castover C-style casts. - Prefer range-based for loops.
- Prefer STL containers over ROOT containers.
- Prefer smart pointers over raw pointers.
- Consider using
autoto reduce type verbosity.
FairRoot/FairShip specific¶
- Use
LOG(SEVERITY)macros instead ofstd::coutor legacyFairLoggermethods. - Use
TFile::Openrather than directTFileconstructors. - Prefer STL vectors and
RVecoverTVectorT. - Prefer
std::stringoverconst char*andTString.
Python guidelines¶
The FairShip wiki has the full Python guidelines. See also the Google Python Style Guide.
General¶
- ALWAYS use
ruff format(for new code) andruff check. - ALWAYS place import statements at the top of the file.
- NEVER run non-trivial code at module top-level scope; hide it behind
if __name__ == "__main__":. - Prefer iterating over containers to manual indexing.
- Prefer
argparseovergetopt. - Use f-strings or
str.format()rather than%-formatting.
FairRoot/FairShip specific¶
- Prefer STL vectors,
RVec, orGenVectoroverTVectorT. - Prefer STL containers or
RTensoroverTMatrix. - Use
len()instead of.size()and.GetEntries()(supported for STL containers,TCAs,TTrees, Pythia8 events, and many other data types).
Getting help¶
Contact ship-software@cern.ch.