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"
9#include "HepMC3/GenVertex.h"
10#include "HepMC3/Relatives.h"
11
12HepMC3::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
46int 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 HEPMC3search_Relatives_EXPORT_API thread_local const Ancestors ANCESTORS
Ancestors.
Definition: Relatives.h:203
static HEPMC3search_Relatives_EXPORT_API thread_local const Descendants DESCENDANTS
Descendants.
Definition: Relatives.h:204
std::vector< HepMC3::ConstGenParticlePtr > ancestor_particles(HepMC3::ConstGenVertexPtr obj)
Return ancestor particles.
Definition: Relatives.cc:188
std::vector< HepMC3::ConstGenVertexPtr > descendant_vertices(HepMC3::ConstGenParticlePtr obj)
Return descendant vertices.
Definition: Relatives.cc:181
std::vector< HepMC3::ConstGenVertexPtr > ancestor_vertices(HepMC3::ConstGenParticlePtr obj)
Return ancestor vertices.
Definition: Relatives.cc:195
std::vector< HepMC3::ConstGenParticlePtr > descendant_particles(HepMC3::ConstGenVertexPtr obj)
Return descendant particles.
Definition: Relatives.cc:174