HepMC3 event record library
hepevt_wrapper_example_main.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/**
7 * @example hepevt_wrapper_example_main.cc
8 * @brief Basic example of HEPEVT interface use
9 *
10 * Fills HEPEVT twice - once using FORTRAN and second time using C++
11 * Tests that both times printouts from FORTRAN and C++ match
12 *
13 * Note that HEPEVT_Wrapper.h file is a standalone header file
14 * and can be copied over to user directory. No linking to HepMC library
15 * is needed to use this wrapper.
16 */
17
19
20#include <iostream>
21using namespace HepMC3;
22
23#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
24#define FC_PHODMP PHODMP
25#define FC_SIMPLE_TAU_HEPEVT_EVENT SIMPLE_TAU_HEPEVT_EVENT
26#else
27#define FC_PHODMP phodmp_
28#define FC_SIMPLE_TAU_HEPEVT_EVENT simple_tau_hepevt_event_
29#endif
30extern "C" void FC_SIMPLE_TAU_HEPEVT_EVENT(); //!< Forward declaration of function defined in hepevt_wrapper_example_fortran.f
31extern "C" void FC_PHODMP(); //!< Forward declaration of function defined in hepevt_wrapper_example_fortran.f
32extern "C" struct HEPEVT_Templated_Simple<10000,double> hepevt_; //!< Forward declaration of fortran block pointer
33
34
35/** @brief Add single particle to HEPEVT event */
36void add_particle(int id, int status, double px, double py, double pz, double e, double m,
37 int mother1, int mother2, int daughter1, int daughter2) {
40
41 HEPEVT_Wrapper::set_status(idx, status);
43 HEPEVT_Wrapper::set_parents(idx, mother1, mother2);
44 HEPEVT_Wrapper::set_children(idx, daughter1, daughter2);
45 HEPEVT_Wrapper::set_momentum(idx, px, py, pz ,e);
47}
48
49/**
50 * @brief Create simple e+ e- -> Z -> tau+ tau- event
51 *
52 * In this example we will place the following event into HEPEVT "by hand"
53 *
54 * 0 Particle Parameters
55 * 0 Nr Type Parent(s) Daughter(s) Px Py Pz E Inv. M.
56 * 1 11 0 3 - 3 0.00 -0.00 45.52 45.52 0.00
57 * 2 -11 0 3 - 3 -0.00 0.00 -45.58 45.58 0.00
58 * 3 23 1 - 2 4 - 5 0.00 0.00 -0.06 91.11 91.11
59 * 4 15 3 6 - 7 -23.19 -26.31 -29.05 45.57 1.78
60 * 5 -15 3 8 - 9 23.19 26.31 28.98 45.53 1.78
61 * 6 16 4 Stable -1.26 -1.80 -1.38 2.59 0.01
62 * 7 -211 4 Stable -21.94 -24.51 -27.67 42.98 0.14
63 * 8 -16 5 Stable 8.44 8.32 9.62 15.26 0.01
64 * 9 211 5 Stable 14.76 17.99 19.36 30.27 0.14
65 * 0 Vector Sum: 0.00 0.00 -0.06 91.11 91.11
66 */
67void simple_tau_hepevt_event_cpp() {
68
71
72 add_particle( 11, 6, 1.7763568394002505e-15, -3.5565894425761324e-15, 4.5521681043409913e+01, 4.5521681043409934e+01,
73 0.0005111e0, 0, 0, 3, 3);
74 add_particle( -11, 6, -1.7763568394002505e-15, 3.5488352204797800e-15, -4.5584999071936601e+01, 4.5584999071936622e+01,
75 0.0005111e0, 0, 0, 3, 3);
76 add_particle( 23, 5, 0e0, 0e0, -6.3318028526687442e-02, 9.1106680115346506e+01,
77 9.1106658112716090e+01, 1, 2, 4, 5);
78 add_particle( 15, 2, -2.3191595992562256e+01, -2.6310500920665142e+01, -2.9046412466624929e+01, 4.5573504956498098e+01,
79 1.7769900000002097e+00, 3, 0, 6, 7);
80 add_particle( -15, 2, 2.3191595992562256e+01, 2.6310500920665142e+01, 2.8983094438098242e+01, 4.5533175158848429e+01,
81 1.7769900000000818e+00, 3, 0, 8, 9);
82 add_particle( 16, 1, -1.2566536214715378e+00, -1.7970251138317268e+00, -1.3801323581022720e+00, 2.5910119010468553e+00,
83 9.9872238934040070e-03, 4, 0, 0, 0);
84 add_particle(-211, 1, -2.1935073012334062e+01, -2.4513624017269400e+01, -2.7666443730700312e+01, 4.2982749776866747e+01,
85 1.3956783711910248e-01, 4, 0, 0, 0);
86 add_particle( -16, 1, 8.4364531743909055e+00, 8.3202830831667836e+00, 9.6202800273055971e+00, 1.5262723881157640e+01,
87 9.9829332903027534e-03, 5, 0, 0, 0);
88 add_particle( 211, 1, 1.4755273459419701e+01, 1.7990366047940022e+01, 1.9362977676297948e+01, 3.0270707771933196e+01,
89 1.3956753909587860e-01, 5, 0, 0, 0);
90}
91
92/** Main program */
93int main() {
94 std::cout << std::endl << "HEPEVT wrapper example - FORTRAN EVENT" << std::endl;
95 std::cout << "--------------------------------------" << std::endl;
96
97 HEPEVT_Wrapper::set_hepevt_address(reinterpret_cast<char*> ((&hepevt_)));
98
99 FC_SIMPLE_TAU_HEPEVT_EVENT();
100
101 std::cout << std::endl << "FORTRAN PRINTOUT" << std::endl << std::endl;
102 FC_PHODMP();
103
104 std::cout << std::endl << "C++ PRINTOUT" << std::endl << std::endl;
106
107 std::cout << std::endl << "HEPEVT wrapper example - C++ EVENT" << std::endl;
108 std::cout << "----------------------------------" << std::endl;
109
110 simple_tau_hepevt_event_cpp();
111
112 std::cout << std::endl << "FORTRAN PRINTOUT" << std::endl << std::endl;
113 FC_PHODMP();
114
115 std::cout << std::endl << "C++ PRINTOUT" << std::endl << std::endl;
117}
Definition of class HEPEVT_Wrapper.
static void set_mass(const int &index, double mass)
Set mass.
static void set_momentum(const int &index, const double &px, const double &py, const double &pz, const double &e)
Set 4-momentum.
static void set_number_entries(const int &noentries)
Set number of entries.
static void print_hepevt(std::ostream &ostr=std::cout)
Print information from HEPEVT common block.
static void zero_everything()
Set all entries in HEPEVT to zero.
static void set_id(const int &index, const int &id)
Set PDG particle id.
static void set_status(const int &index, const int &status)
Set status code.
static void set_hepevt_address(char *c)
Set Fortran block address.
static void set_parents(const int &index, const int &firstparent, const int &lastparent)
Set parents.
static void set_children(const int &index, const int &firstchild, const int &lastchild)
Set children.
static int number_entries()
Get number of entries.
static void set_event_number(const int &evtno)
Set event number.
HepMC3 main namespace.