{
"cells": [
{
"cell_type": "markdown",
"id": "13df81da",
"metadata": {},
"source": [
"# df017_vecOpsHEP\n",
"Use RVecs to plot the transverse momentum of selected particles.\n",
"\n",
"This tutorial shows how VecOps can be used to slim down the programming\n",
"model typically adopted in HEP for analysis.\n",
"In this case we have a dataset containing the kinematic properties of\n",
"particles stored in individual arrays.\n",
"We want to plot the transverse momentum of these particles if the energy is\n",
"greater than 100 MeV.\n",
"\n",
"\n",
"\n",
"\n",
"**Author:** Danilo Piparo (CERN), Andre Vieira Silva \n",
"This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:06 PM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "2f99c75b",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:06:59.607457Z",
"iopub.status.busy": "2024-03-19T19:06:59.607009Z",
"iopub.status.idle": "2024-03-19T19:07:00.493206Z",
"shell.execute_reply": "2024-03-19T19:07:00.487514Z"
}
},
"outputs": [],
"source": [
"auto filename = gROOT->GetTutorialDir() + \"/dataframe/df017_vecOpsHEP.root\";\n",
"auto treename = \"myDataset\";\n",
"\n",
"using namespace ROOT;"
]
},
{
"cell_type": "markdown",
"id": "5e0a5a0b",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "9f39e934",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:00.504837Z",
"iopub.status.busy": "2024-03-19T19:07:00.504456Z",
"iopub.status.idle": "2024-03-19T19:07:00.621208Z",
"shell.execute_reply": "2024-03-19T19:07:00.620089Z"
}
},
"outputs": [],
"source": [
"%%cpp -d\n",
"void WithTTreeReader()\n",
"{\n",
" TFile f(filename);\n",
" TTreeReader tr(treename, &f);\n",
" TTreeReaderArray px(tr, \"px\");\n",
" TTreeReaderArray py(tr, \"py\");\n",
" TTreeReaderArray E(tr, \"E\");\n",
"\n",
" TH1F h(\"pt\", \"pt\", 16, 0, 4);\n",
"\n",
" while (tr.Next()) {\n",
" for (auto i=0U;i < px.GetSize(); ++i) {\n",
" if (E[i] > 100) h.Fill(sqrt(px[i]*px[i] + py[i]*py[i]));\n",
" }\n",
" }\n",
" h.DrawCopy();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "5ca2e135",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8be4598e",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:00.625428Z",
"iopub.status.busy": "2024-03-19T19:07:00.624852Z",
"iopub.status.idle": "2024-03-19T19:07:00.637652Z",
"shell.execute_reply": "2024-03-19T19:07:00.636695Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"input_line_53:3:3: error: unknown type name 'RDataFrame'\n",
" RDataFrame f(treename, filename.Data());\n",
" ^\n",
"input_line_53:4:21: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_53:4:32: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_53:4:43: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_53:5:7: error: unknown type name 'RVecD'\n",
" RVecD v;\n",
" ^\n",
"input_line_53:14:14: error: use of undeclared identifier 'RVecD'\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^\n",
"input_line_53:14:42: error: expected ';' after expression\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^\n",
" ;\n",
"input_line_53:14:43: error: expected ')'\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^\n",
"input_line_53:14:20: note: to match this '('\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^\n",
"input_line_53:14:52: error: member reference type 'int' is not a pointer\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~ ^\n",
"input_line_53:14:22: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^~~~\n",
"input_line_53:14:28: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^~~~\n",
"input_line_53:14:34: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^~\n",
"input_line_53:14:41: warning: expression result unused [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
" ^\n"
]
}
],
"source": [
"%%cpp -d\n",
"void WithRDataFrame()\n",
"{\n",
" RDataFrame f(treename, filename.Data());\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" RVecD v;\n",
" for (auto i=0U;i < px.size(); ++i) {\n",
" if (E[i] > 100) {\n",
" v.emplace_back(sqrt(px[i]*px[i] + py[i]*py[i]));\n",
" }\n",
" }\n",
" return v;\n",
" };\n",
" f.Define(\"pt\", CalcPt, {\"px\", \"py\", \"E\"})\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"pt\")->DrawCopy();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "c32c14e2",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1bf13922",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:00.641754Z",
"iopub.status.busy": "2024-03-19T19:07:00.641425Z",
"iopub.status.idle": "2024-03-19T19:07:00.655529Z",
"shell.execute_reply": "2024-03-19T19:07:00.654443Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"input_line_54:3:4: error: unknown type name 'RDataFrame'\n",
" RDataFrame f(treename, filename.Data());\n",
" ^\n",
"input_line_54:4:21: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_54:4:32: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_54:4:43: error: unknown type name 'RVecD'\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" ^\n",
"input_line_54:9:14: error: use of undeclared identifier 'RVecD'\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^\n",
"input_line_54:9:42: error: expected ';' after expression\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^\n",
" ;\n",
"input_line_54:9:43: error: expected ')'\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^\n",
"input_line_54:9:20: note: to match this '('\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^\n",
"input_line_54:9:57: error: member reference type 'int' is not a pointer\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ~~~~~~~~~~~~~~~~~~~~~~~~ ^\n",
"input_line_54:9:22: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^~~~\n",
"input_line_54:9:28: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^~~~\n",
"input_line_54:9:34: warning: left operand of comma operator has no effect [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^~\n",
"input_line_54:9:41: warning: expression result unused [-Wunused-value]\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
" ^\n"
]
}
],
"source": [
"%%cpp -d\n",
"void WithRDataFrameVecOps()\n",
"{\n",
" RDataFrame f(treename, filename.Data());\n",
" auto CalcPt = [](RVecD &px, RVecD &py, RVecD &E) {\n",
" auto pt = sqrt(px*px + py*py);\n",
" return pt[E>100];\n",
" };\n",
" f.Define(\"good_pt\", CalcPt, {\"px\", \"py\", \"E\"})\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "d8e67667",
"metadata": {},
"source": [
" Definition of a helper function: "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "eac412cc",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:00.660189Z",
"iopub.status.busy": "2024-03-19T19:07:00.659889Z",
"iopub.status.idle": "2024-03-19T19:07:00.671431Z",
"shell.execute_reply": "2024-03-19T19:07:00.670064Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"input_line_55:3:4: error: unknown type name 'RDataFrame'\n",
" RDataFrame f(treename, filename.Data());\n",
" ^\n"
]
}
],
"source": [
"%%cpp -d\n",
"void WithRDataFrameVecOpsJit()\n",
"{\n",
" RDataFrame f(treename, filename.Data());\n",
" f.Define(\"good_pt\", \"sqrt(px*px + py*py)[E>100]\")\n",
" .Histo1D({\"pt\", \"pt\", 16, 0, 4}, \"good_pt\")->DrawCopy();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "8f17e392",
"metadata": {},
"source": [
"We plot four times the same quantity, the key is to look into the implementation\n",
"of the functions above."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "71b3680b",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:00.675973Z",
"iopub.status.busy": "2024-03-19T19:07:00.675646Z",
"iopub.status.idle": "2024-03-19T19:07:01.556899Z",
"shell.execute_reply": "2024-03-19T19:07:01.555757Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"input_line_59:2:3: error: use of undeclared identifier 'WithRDataFrame'\n",
" (WithRDataFrame())\n",
" ^\n",
"Error in : Error evaluating expression (WithRDataFrame())\n",
"Execution of your code was aborted.\n"
]
}
],
"source": [
"auto c = new TCanvas();\n",
"c->Divide(2,2);\n",
"c->cd(1);\n",
"WithTTreeReader();\n",
"c->cd(2);\n",
"WithRDataFrame();\n",
"c->cd(3);\n",
"WithRDataFrameVecOps();\n",
"c->cd(4);\n",
"WithRDataFrameVecOpsJit();"
]
},
{
"cell_type": "markdown",
"id": "956a1f51",
"metadata": {},
"source": [
"Draw all canvases "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ff4bcf17",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:01.561244Z",
"iopub.status.busy": "2024-03-19T19:07:01.560920Z",
"iopub.status.idle": "2024-03-19T19:07:02.033578Z",
"shell.execute_reply": "2024-03-19T19:07:02.023671Z"
}
},
"outputs": [
{
"data": {
"image/png": "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JBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgEgoAACRUAAAIqEAAERCAQCIhAIAEAkFACASCgBAJBQAgOj/5Un9o4FZY80AAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gROOT->GetListOfCanvases()->Draw()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ROOT C++",
"language": "c++",
"name": "root"
},
"language_info": {
"codemirror_mode": "text/x-c++src",
"file_extension": ".C",
"mimetype": " text/x-c++src",
"name": "c++"
}
},
"nbformat": 4,
"nbformat_minor": 5
}