Git Product home page Git Product logo

correctionlib's Introduction

correctionlib

Actions Status Documentation Status Code style: black

PyPI version PyPI platforms

GitHub Discussion

Introduction

The purpose of this library is to provide a well-structured JSON data format for a wide variety of ad-hoc correction factors encountered in a typical HEP analysis and a companion evaluation tool suitable for use in C++ and python programs. Here we restrict our definition of correction factors to a class of functions with scalar inputs that produce a scalar output.

In python, the function signature is:

from typing import Union

def f(*args: Union[str,int,float]) -> float:
    return ...

In C++, the evaluator implements this currently as:

double Correction::evaluate(const std::vector<std::variant<int, double, std::string>>& values) const;

The supported function classes include:

  • multi-dimensional binned lookups;
  • binned lookups pointing to multi-argument formulas with a restricted math function set (exp, sqrt, etc.);
  • categorical (string or integer enumeration) maps;
  • input transforms (updating one input value in place); and
  • compositions of the above.

Each function type is represented by a "node" in a call graph and holds all of its parameters in a JSON structure, described by the JSON schema. Possible future extension nodes might include weigted sums (which, when composed with the others, could represent a BDT) and perhaps simple MLPs.

The tool should provide:

  • standardized, versioned JSON schemas;
  • forward-porting tools (to migrate data written in older schema versions); and
  • a well-optimized C++ evaluator and python bindings (with numpy vectorization support).

This tool will definitely not provide:

  • support for TLorentzVector or other object-type inputs (such tools should be written as a higher-level tool depending on this library as a low-level tool)

Formula support currently includes a mostly-complete subset of the ROOT library TFormula class, and is implemented in a threadsafe standalone manner. The parsing grammar is formally defined and parsed through the use of a header-only PEG parser library. The supported features mirror CMSSW's reco::formulaEvaluator and fully passes the test suite for that utility with the purposeful exception of the TMath:: namespace. The python bindings may be able to call into numexpr, though, due to the tree-like structure of the corrections, it may prove difficult to exploit vectorization at levels other than the entrypoint.

Installation

The build process is based on setuptools, with CMake (through scikit-build) for the C++ evaluator and its python bindings module. Builds have been tested in Windows, OS X, and Linux, and python bindings can be compiled against both python2 and python3, as well as from within a CMSSW environment. The python bindings are distributed as a pip-installable package. Note that CMSSW 11_2_X and above has ROOT accessible from python 3.

To install in an environment that has python 3, you can simply

python3 -m pip install correctionlib

(possibly with --user, or in a virtualenv, etc.) If you wish to install the latest development version,

python3 -m pip install git+https://github.com/cms-nanoAOD/correctionlib.git

should work.

The C++ evaluator library is distributed as part of the python package, and it can be linked to directly without using python. If you are using CMake you can depend on it by including the output of correction config --cmake in your cmake invocation. A complete cmake example that builds a user C++ application against correctionlib and ROOT RDataFrame can be found here.

For manual compilation, include and linking definitions can similarly be found via correction config --cflags --ldflags. For example, the demo application can be compiled with:

wget https://raw.githubusercontent.com/cms-nanoAOD/correctionlib/master/src/demo.cc
g++ $(correction config --cflags --ldflags --rpath) demo.cc -o demo

If the correction command-line utility is not on your path for some reason, it can also be invoked via python -m correctionlib.cli.

To compile with python2 support, consider using python 3 :) If you considered that and still want to use python2, the following recipe may work:

git clone --recursive [email protected]:cms-nanoAOD/correctionlib.git
cd correctionlib
make PYTHON=python2 correctionlib

Inside CMSSW you should use make PYTHON=python correctionlib assuming python is the name of the scram tool you intend to link against. This will output a correctionlib directory that acts as a python package, and can be moved where needed. This package will only provide the correctionlib._core evaluator module, as the schema tools and high-level bindings are python3-only.

Creating new corrections

The correctionlib.schemav2 module provides a helpful framework for defining correction objects and correctionlib.convert includes select conversion routines for common types. Nodes can be type-checked as they are constructed using the parse_obj class method or by directly constructing them using keyword arguments. Some examples can be found in data/conversion.py. The tests/ directory may also be helpful.

Developing

See CONTRIBUTING.md

correctionlib's People

Contributors

nsmith- avatar dependabot[bot] avatar izaakwn avatar pieterdavid avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.