HepMC3 event record library
search_example.cc
1// -*- C++ -*-
2//
3// This file is part of HepMC
4// Copyright (C) 2014-2023 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{
14 auto* e=new HepMC3::GenEvent();
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().empty()) 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().empty()) 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
HepMC3 main namespace.
std::vector< HepMC3::ConstGenParticlePtr > ancestor_particles(const HepMC3::ConstGenVertexPtr &obj)
Return ancestor particles.
Definition Relatives.cc:190
std::vector< HepMC3::ConstGenParticlePtr > descendant_particles(const HepMC3::ConstGenVertexPtr &obj)
Return descendant particles.
Definition Relatives.cc:176
std::vector< HepMC3::ConstGenVertexPtr > ancestor_vertices(const HepMC3::ConstGenParticlePtr &obj)
Return ancestor vertices.
Definition Relatives.cc:197
std::vector< HepMC3::ConstGenVertexPtr > descendant_vertices(const HepMC3::ConstGenParticlePtr &obj)
Return descendant vertices.
Definition Relatives.cc:183