In this tutorial we learn how elements of an RVec can be easily sorted and selected.
Author: Stefan Wunsch
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 28, 2023 at 10:03 AM.
import ROOT
from ROOT.VecOps import Argsort, Take, Sort, Reverse
Welcome to JupyROOT 6.29/01
RVec can be sorted in Python with the inbuilt sorting function because PyROOT implements a Python iterator
v1 = ROOT.RVecD(3)
v1[0], v1[1], v1[2] = 6, 4, 5
v2 = sorted(v1)
print("Sort vector {}: {}".format(v1, v2))
Sort vector { 6.0000000, 4.0000000, 5.0000000 }: [4.0, 5.0, 6.0]
For convenience, ROOT implements helpers, e.g., to get a sorted copy of an RVec ...
v2 = Sort(v1);
print("Sort vector {}: {}".format(v1, v2))
Sort vector { 6.0000000, 4.0000000, 5.0000000 }: { 4.0000000, 5.0000000, 6.0000000 }
... or a reversed copy of an RVec.
v2 = Reverse(v1);
print("Reverse vector {}: {}".format(v1, v2))
Reverse vector { 6.0000000, 4.0000000, 5.0000000 }: { 5.0000000, 4.0000000, 6.0000000 }
Helpers are provided to get the indices that sort the vector and to select these indices from an RVec.
v2 = Argsort(v1)
print("Indices that sort the vector {}: {}".format(v1, v2))
v3 = ROOT.RVecD(3)
v3[0], v3[1], v3[2] = 9, 7, 8
v4 = Take(v3, v2)
print("Sort vector {} respective to the previously determined indices: {}".format(v3, v4))
Indices that sort the vector { 6.0000000, 4.0000000, 5.0000000 }: { 1, 2, 0 } Sort vector { 9.0000000, 7.0000000, 8.0000000 } respective to the previously determined indices: { 7.0000000, 8.0000000, 9.0000000 }
Take can also be used to get the first or last elements of an RVec.
v2 = Take(v1, 2)
v3 = Take(v1, -2)
print("Take the two first and last elements of vector {}: {}, {}".format(v1, v2, v3))
Take the two first and last elements of vector { 6.0000000, 4.0000000, 5.0000000 }: { 6.0000000, 4.0000000 }, { 4.0000000, 5.0000000 }
Because the VecOps helpers return a copy of the input, you can chain the operations conveniently.
v2 = Reverse(Take(Sort(v1), -2))
print("Sort the vector {}, take the two last elements and reverse the selection: {}".format(v1, v2))
Sort the vector { 6.0000000, 4.0000000, 5.0000000 }, take the two last elements and reverse the selection: { 6.0000000, 5.0000000 }