HepMC event record
hepevt_wrapper_example_main.cc
1 // -*- C++ -*-
2 //
3 // This file is part of HepMC
4 // Copyright (C) 2014 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 HepMC/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 
18 
19 /* These two define statements can be used to change HEPEVT definition.
20  They must be defined before including HepMC/HEPEVT_Wrapper.h
21  For this test, if these values were to be changed, the same changes
22  must be included in FORTRAN code
23 
24  NOTE: default is NMXHEP=10000 and double precision */
25 
26 //#define HEPMC_HEPEVT_NMXHEP 4000
27 //#define HEPMC_HEPEVT_PRECISION float
28 #include "HepMC/HEPEVT_Wrapper.h"
29 
30 #include <iostream>
32 using std::cout;
33 using std::endl;
34 
35 extern "C" void simple_tau_hepevt_event_(); //!< Forward declaration of function defined in hepevt_wrapper_example_fortran.f
36 extern "C" void phodmp_(); //!< Forward declaration of function defined in hepevt_wrapper_example_fortran.f
37 extern "C" struct HEPEVT hepevt_; //!< Forward declaration of fortran block pointer
38 
39 /** @brief Add single particle to HEPEVT event */
40 void add_particle(int id, int status, double px, double py, double pz, double e, double m,
41  int mother1, int mother2, int daughter1, int daughter2) {
42  int idx = HEPEVT_Wrapper::number_entries()+1;
43  HEPEVT_Wrapper::set_number_entries(idx);
44 
45  HEPEVT_Wrapper::set_status(idx, status);
46  HEPEVT_Wrapper::set_id(idx, id);
47  HEPEVT_Wrapper::set_parents(idx, mother1, mother2);
48  HEPEVT_Wrapper::set_children(idx, daughter1, daughter2);
49  HEPEVT_Wrapper::set_momentum(idx, px, py, pz ,e);
50  HEPEVT_Wrapper::set_mass(idx, m);
51 }
52 
53 /**
54  * @brief Create simple e+ e- -> Z -> tau+ tau- event
55  *
56  * In this example we will place the following event into HEPEVT "by hand"
57  *
58  * 0 Particle Parameters
59  * 0 Nr Type Parent(s) Daughter(s) Px Py Pz E Inv. M.
60  * 1 11 0 3 - 3 0.00 -0.00 45.52 45.52 0.00
61  * 2 -11 0 3 - 3 -0.00 0.00 -45.58 45.58 0.00
62  * 3 23 1 - 2 4 - 5 0.00 0.00 -0.06 91.11 91.11
63  * 4 15 3 6 - 7 -23.19 -26.31 -29.05 45.57 1.78
64  * 5 -15 3 8 - 9 23.19 26.31 28.98 45.53 1.78
65  * 6 16 4 Stable -1.26 -1.80 -1.38 2.59 0.01
66  * 7 -211 4 Stable -21.94 -24.51 -27.67 42.98 0.14
67  * 8 -16 5 Stable 8.44 8.32 9.62 15.26 0.01
68  * 9 211 5 Stable 14.76 17.99 19.36 30.27 0.14
69  * 0 Vector Sum: 0.00 0.00 -0.06 91.11 91.11
70  */
71 void simple_tau_hepevt_event_cpp() {
72 
73  HEPEVT_Wrapper::zero_everything();
74  HEPEVT_Wrapper::set_event_number(1);
75 
76  add_particle( 11, 6, 1.7763568394002505e-15, -3.5565894425761324e-15, 4.5521681043409913e+01, 4.5521681043409934e+01,
77  0.0005111e0, 0, 0, 3, 3);
78  add_particle( -11, 6, -1.7763568394002505e-15, 3.5488352204797800e-15, -4.5584999071936601e+01, 4.5584999071936622e+01,
79  0.0005111e0, 0, 0, 3, 3);
80  add_particle( 23, 5, 0e0, 0e0, -6.3318028526687442e-02, 9.1106680115346506e+01,
81  9.1106658112716090e+01, 1, 2, 4, 5);
82  add_particle( 15, 2, -2.3191595992562256e+01, -2.6310500920665142e+01, -2.9046412466624929e+01, 4.5573504956498098e+01,
83  1.7769900000002097e+00, 3, 0, 6, 7);
84  add_particle( -15, 2, 2.3191595992562256e+01, 2.6310500920665142e+01, 2.8983094438098242e+01, 4.5533175158848429e+01,
85  1.7769900000000818e+00, 3, 0, 8, 9);
86  add_particle( 16, 1, -1.2566536214715378e+00, -1.7970251138317268e+00, -1.3801323581022720e+00, 2.5910119010468553e+00,
87  9.9872238934040070e-03, 4, 0, 0, 0);
88  add_particle(-211, 1, -2.1935073012334062e+01, -2.4513624017269400e+01, -2.7666443730700312e+01, 4.2982749776866747e+01,
89  1.3956783711910248e-01, 4, 0, 0, 0);
90  add_particle( -16, 1, 8.4364531743909055e+00, 8.3202830831667836e+00, 9.6202800273055971e+00, 1.5262723881157640e+01,
91  9.9829332903027534e-03, 5, 0, 0, 0);
92  add_particle( 211, 1, 1.4755273459419701e+01, 1.7990366047940022e+01, 1.9362977676297948e+01, 3.0270707771933196e+01,
93  1.3956753909587860e-01, 5, 0, 0, 0);
94 }
95 
96 /** Main program */
97 int main() {
98  cout << endl << "HEPEVT wrapper example - FORTRAN EVENT" << endl;
99  cout << "--------------------------------------" << endl;
100 
101  HEPEVT_Wrapper::set_hepevt_address((char*)(&hepevt_));
102 
103  simple_tau_hepevt_event_();
104 
105  cout << endl << "FORTRAN PRINTOUT" << endl << endl;
106  phodmp_();
107 
108  cout << endl << "C++ PRINTOUT" << endl << endl;
109  HEPEVT_Wrapper::print_hepevt();
110 
111  cout << endl << "HEPEVT wrapper example - C++ EVENT" << endl;
112  cout << "----------------------------------" << endl;
113 
114  simple_tau_hepevt_event_cpp();
115 
116  cout << endl << "FORTRAN PRINTOUT" << endl << endl;
117  phodmp_();
118 
119  cout << endl << "C++ PRINTOUT" << endl << endl;
120  HEPEVT_Wrapper::print_hepevt();
121 }
An interface to HEPEVT common block.
Fortran common block HEPEVT.
int main(int argc, char **argv)