Data and categories: demonstration of discrete-discrete (invertable) functions 
 
import ROOT
 
 
 
tagCat = ROOT.RooCategory("tagCat", "Tagging category")
tagCat.defineType("Lepton")
tagCat.defineType("Kaon")
tagCat.defineType("NetTagger-1")
tagCat.defineType("NetTagger-2")
tagCat.Print()
 
b0flav = ROOT.RooCategory("b0flav", "B0 flavour eigenstate", {"B0": -1, "B0bar": 1})
b0flav.Print()
 
x = ROOT.RooRealVar("x", "x", 0, 10)
p = ROOT.RooPolynomial("p", "p", x)
data = p.generate({x, b0flav, tagCat}, 10000)
 
 
tcatType = ROOT.RooMappedCategory("tcatType", "tagCat type", tagCat, "Cut based")
 
tcatType.map("Lepton", "Cut based")
tcatType.map("Kaon", "Cut based")
 
tcatType.map("NetTagger*", "Neural Network")
 
mtable = data.table(tcatType)
mtable.Print("v")
 
 
b0Xtcat = ROOT.RooSuperCategory("b0Xtcat", "b0flav X tagCat", {b0flav, tagCat})
 
stable = data.table(b0Xtcat)
stable.Print("v")
 
b0Xtcat.setLabel("{B0bar;Lepton}")
 
b0Xttype = ROOT.RooMultiCategory("b0Xttype", "b0flav X tagType", {b0flav, tcatType})
 
xtable = data.table(b0Xttype)
xtable.Print("v")
  RooCategory::tagCat = Lepton(idx = 0)
 
RooCategory::b0flav = B0(idx = -1)
 
 
  Table tcatType : pData
  +----------------+------+
  |      Cut based | 5040 |
  | Neural Network | 4960 |
  +----------------+------+
 
 
  Table b0Xtcat : pData
  +---------------------+------+
  |         {B0;Lepton} | 1302 |
  |      {B0bar;Lepton} | 1192 |
  |           {B0;Kaon} | 1232 |
  |        {B0bar;Kaon} | 1314 |
  |    {B0;NetTagger-1} | 1242 |
  | {B0bar;NetTagger-1} | 1208 |
  |    {B0;NetTagger-2} | 1282 |
  | {B0bar;NetTagger-2} | 1228 |
  +---------------------+------+
 
 
  Table b0Xttype : pData
  +------------------------+------+
  |         {B0;Cut based} | 2534 |
  |      {B0bar;Cut based} | 2506 |
  |    {B0;Neural Network} | 2524 |
  | {B0bar;Neural Network} | 2436 |
  +------------------------+------+
 
- Date
 - February 2018 
 
- Authors
 - Clemens Lange, Wouter Verkerke (C++ version) 
 
Definition in file rf406_cattocatfuncs.py.