Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
vo005_Combinations.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_vecops
3 /// \notebook -nodraw
4 /// In this tutorial we learn how combinations of RVecs can be build.
5 ///
6 /// \macro_code
7 /// \macro_output
8 ///
9 /// \date August 2018
10 /// \author Stefan Wunsch
11 
12 using namespace ROOT::VecOps;
13 
14 void vo005_Combinations()
15 {
16  // The starting point are two collections and we want to calculate the result
17  // of combinations of the elements.
18  RVec<double> v1{1., 2., 3.};
19  RVec<double> v2{-4., -5.};
20 
21  // To get the indices, which result in all combinations, you can call the
22  // following helper.
23  // Note that you can also pass the size of the vectors directly.
24  auto idx = Combinations(v1, v2);
25 
26  // Next, the respective elements can be taken via the computed indices.
27  auto c1 = Take(v1, idx[0]);
28  auto c2 = Take(v2, idx[1]);
29 
30  // Finally, you can perform any set of operations conveniently.
31  auto v3 = c1 * c2;
32 
33  std::cout << "Combinations of " << v1 << " and " << v2 << ":" << std::endl;
34  for(size_t i=0; i<v3.size(); i++) {
35  std::cout << c1[i] << " * " << c2[i] << " = " << v3[i] << std::endl;
36  }
37  std::cout << std::endl;
38 
39  // However, if you want to compute operations on unique combinations of a
40  // single RVec, you can perform this as follows.
41 
42  // Get the indices of unique triples for the given vector.
43  RVec<double> v4{1., 2., 3., 4.};
44  auto idx2 = Combinations(v4, 3);
45 
46  // Take the elements and compute any operation on the returned collections.
47  auto c3 = Take(v4, idx2[0]);
48  auto c4 = Take(v4, idx2[1]);
49  auto c5 = Take(v4, idx2[2]);
50 
51  auto v5 = c3 * c4 * c5;
52 
53  std::cout << "Unique triples of " << v4 << ":" << std::endl;
54  for(size_t i=0; i<v4.size(); i++) {
55  std::cout << c3[i] << " * " << c4[i] << " * " << c5[i] << " = " << v5[i] << std::endl;
56  }
57  std::cout << std::endl;
58 }