HepMC3 event record library
search_example.cc
1 // -*- C++ -*-
2 //
3 // This file is part of HepMC
4 // Copyright (C) 2014-2019 The HepMC collaboration (see AUTHORS for details)
5 //
6 #include "HepMC3/GenEvent.h"
7 #include "HepMC3/Print.h"
8 #include "HepMC3/GenParticle.h"
9 #include "HepMC3/GenVertex.h"
10 #include "HepMC3/Relatives.h"
11 
12 HepMC3::GenEvent* generate_event(const size_t n,const size_t iterations)
13 {
15  HepMC3::GenVertexPtr v0=std::make_shared<HepMC3::GenVertex>();
16  e->add_vertex(v0);
17  size_t it=0;
18  for (;;)
19  {
20  if (it>iterations)
21  {
22  for (auto v: e->vertices())
23  {
24  if (v->particles_out().size()!=0) continue;
25  for (size_t i=0; i<n; i++) v->add_particle_out(std::make_shared<HepMC3::GenParticle>());
26  }
27  break;
28  }
29  auto vertices=e->vertices();
30  for (auto v: vertices)
31  {
32  if (v->particles_out().size()!=0) continue;
33  for (size_t i=0; i<n; i++) v->add_particle_out(std::make_shared<HepMC3::GenParticle>());
34  for (auto p: v->particles_out())
35  {
36  HepMC3::GenVertexPtr vx=std::make_shared<HepMC3::GenVertex>();
37  vx->add_particle_in(p);
38  e->add_vertex(vx);
39  }
40  }
41  it++;
42  }
43  return e;
44 }
45 
46 int main()
47 {
48  std::cout<<"search_example: start"<<std::endl;
49  auto start0 = std::chrono::system_clock::now();
50  for (int i=0; i<10000; i++)
51  {
52  HepMC3::GenEvent* evt=generate_event(3,4);
53  delete evt;
54  }
55  auto end0 = std::chrono::system_clock::now();
56  std::cout<<"search_example: generation of events "<<std::chrono::duration_cast<std::chrono::milliseconds>(end0 - start0).count()<<" ms"<<std::endl;
57 
58  auto start1 = std::chrono::system_clock::now();
59  size_t np1=0;
60  for (int i=0; i<10000; i++)
61  {
62  HepMC3::GenEvent* evt=generate_event(3,4);
63  for (auto p: evt->particles()) np1+=HepMC3::descendant_particles(p).size();
64  delete evt;
65  }
66  auto end1 = std::chrono::system_clock::now();
67  std::cout<<"search_example: generation of events and descendants_of_same_type() "
68  <<std::chrono::duration_cast<std::chrono::milliseconds>(end1 - start1).count()<<" ms"
69  << " total number of decandants: "<<np1<<std::endl;
70 
71  auto start2 = std::chrono::system_clock::now();
72  size_t np2=0;
73  for (int i=0; i<10000; i++)
74  {
75  HepMC3::GenEvent* evt=generate_event(3,4);
76  for (auto p: evt->particles()) np2+=(HepMC3::Relatives::DESCENDANTS(p)).size();
77  delete evt;
78  }
79  auto end2 = std::chrono::system_clock::now();
80  std::cout<<"search_example: generation of events and Relatives::DESCENDANTS() "
81  <<std::chrono::duration_cast<std::chrono::milliseconds>(end2 - start2).count()<<" ms"
82  << " total number of decandants: "<<np2<<std::endl;
83 
84  auto start3 = std::chrono::system_clock::now();
85  size_t np3=0;
86  for (int i=0; i<10000; i++)
87  {
88  HepMC3::GenEvent* evt=generate_event(3,4);
89  for (auto p: evt->particles()) np3+=HepMC3::ancestor_particles(p).size();
90  delete evt;
91  }
92  auto end3 = std::chrono::system_clock::now();
93  std::cout<<"search_example: generation of events and ancestors_of_same_type() "
94  <<std::chrono::duration_cast<std::chrono::milliseconds>(end3 - start3).count()<<" ms"
95  << " total number of ancestors: "<<np3<<std::endl;
96 
97 
98  auto start4 = std::chrono::system_clock::now();
99  size_t np4=0;
100  for (int i=0; i<10000; i++)
101  {
102  HepMC3::GenEvent* evt=generate_event(3,4);
103  for (auto p: evt->particles()) np4+=(HepMC3::Relatives::ANCESTORS(p)).size();
104  delete evt;
105  }
106  auto end4 = std::chrono::system_clock::now();
107  std::cout<<"search_example: generation of events and Relatives::ANCESTORS() "
108  <<std::chrono::duration_cast<std::chrono::milliseconds>(end4 - start4).count()<<" ms"
109  << " total number of ancestors: "<<np4<<std::endl;
110 
111  auto start1o = std::chrono::system_clock::now();
112  size_t np1o=0;
113  for (int i=0; i<10000; i++)
114  {
115  HepMC3::GenEvent* evt=generate_event(3,4);
116  for (auto p: evt->particles()) np1o+=HepMC3::descendant_vertices(p).size();
117  delete evt;
118  }
119  auto end1o = std::chrono::system_clock::now();
120  std::cout<<"search_example: generation of events and descendants_of_other_type() "
121  <<std::chrono::duration_cast<std::chrono::milliseconds>(end1o - start1o).count()<<" ms"
122  << " total number of decandants: "<<np1o<<std::endl;
123 
124 
125  auto start3o = std::chrono::system_clock::now();
126  size_t np3o=0;
127  for (int i=0; i<10000; i++)
128  {
129  HepMC3::GenEvent* evt=generate_event(3,4);
130  for (auto p: evt->particles()) np3o+=HepMC3::ancestor_vertices(p).size();
131  delete evt;
132  }
133  auto end3o = std::chrono::system_clock::now();
134  std::cout<<"search_example: generation of events and ancestors_of_other_type() "
135  <<std::chrono::duration_cast<std::chrono::milliseconds>(end3o - start3o).count()<<" ms"
136  << " total number of decandants: "<<np3o<<std::endl;
137 
138  std::cout<<"search_example: end"<<std::endl;
139  return EXIT_SUCCESS;
140 }
Definition of class GenEvent.
Definition of class GenParticle.
Definition of class GenVertex.
Definition of static class Print.
Defines helper classes to extract relatives of an input GenParticle or GenVertex.
Stores event-related information.
Definition: GenEvent.h:41
void add_vertex(GenVertexPtr v)
Add vertex.
Definition: GenEvent.cc:96
const std::vector< ConstGenVertexPtr > & vertices() const
Get list of vertices (const)
Definition: GenEvent.cc:43
const std::vector< ConstGenParticlePtr > & particles() const
Get list of particles (const)
Definition: GenEvent.cc:39
static thread_local const Ancestors ANCESTORS
Ancestors.
Definition: Relatives.h:66
static thread_local const Descendants DESCENDANTS
Descendants.
Definition: Relatives.h:67
std::vector< HepMC3::ConstGenParticlePtr > ancestor_particles(HepMC3::ConstGenVertexPtr obj)
Return ancestor particles.
Definition: Relatives.cc:183
std::vector< HepMC3::ConstGenVertexPtr > descendant_vertices(HepMC3::ConstGenParticlePtr obj)
Return descendant vertices.
Definition: Relatives.cc:176
std::vector< HepMC3::ConstGenVertexPtr > ancestor_vertices(HepMC3::ConstGenParticlePtr obj)
Return ancestor vertices.
Definition: Relatives.cc:190
std::vector< HepMC3::ConstGenParticlePtr > descendant_particles(HepMC3::ConstGenVertexPtr obj)
Return descendant particles.
Definition: Relatives.cc:169
int main(int argc, char **argv)