File: example_UsingIterators.cc

package info (click to toggle)
hepmc 2.06.09-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 11,524 kB
  • ctags: 1,521
  • sloc: sh: 9,138; cpp: 8,113; ansic: 682; makefile: 240; csh: 6; fortran: 4
file content (169 lines) | stat: -rw-r--r-- 5,959 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//////////////////////////////////////////////////////////////////////////
// Matt.Dobbs@Cern.CH, Feb 2000
// This example shows low to use the particle and vertex iterators
//////////////////////////////////////////////////////////////////////////
// To Compile: go to the HepMC directory and type:
// gmake examples/example_UsingIterators.exe
//

#include "HepMC/IO_GenEvent.h"
#include "HepMC/GenEvent.h"
#include <math.h>
#include <algorithm>
#include <list>

//! example class

/// \class  IsPhoton
/// this predicate returns true if the input particle is a photon
/// in the central region (eta < 2.5) with pT > 10 GeV
class IsPhoton {
public:
    /// returns true if the GenParticle is a photon with more than 10 GeV transverse momentum
    bool operator()( const HepMC::GenParticle* p ) { 
	if ( p->pdg_id() == 22 
	     && p->momentum().perp() > 10. ) return 1;
	return 0;
    }
};

//! example class

/// \class  IsW_Boson
/// this predicate returns true if the input particle is a W+/W-
class IsW_Boson {
public:
    /// returns true if the GenParticle is a W
    bool operator()( const HepMC::GenParticle* p ) { 
	if ( abs(p->pdg_id()) == 24 ) return 1;
	return 0;
    }
};

//! example class

/// \class  IsStateFinal
/// this predicate returns true if the input has no decay vertex
class IsStateFinal {
public:
    /// returns true if the GenParticle does not decay
    bool operator()( const HepMC::GenParticle* p ) { 
	if ( !p->end_vertex() && p->status()==1 ) return 1;
	return 0;
    }
};

int main() {
    { // begin scope of ascii_in
	// an event has been prepared in advance for this example, read it
	// into memory using the IO_GenEvent input strategy
	HepMC::IO_GenEvent ascii_in("example_UsingIterators.txt",std::ios::in);
	if ( ascii_in.rdstate() == std::ios::failbit ) {
	    std::cerr << "ERROR input file example_UsingIterators.txt is needed "
		      << "and does not exist. "
		      << "\n Look for it in HepMC/examples, Exit." << std::endl;
	    return 1;
	}

	HepMC::GenEvent* evt = ascii_in.read_next_event();

	// if you wish to have a look at the event, then use evt->print();

	// use GenEvent::vertex_iterator to fill a list of all 
	// vertices in the event
	std::list<HepMC::GenVertex*> allvertices;
	for ( HepMC::GenEvent::vertex_iterator v = evt->vertices_begin();
	      v != evt->vertices_end(); ++v ) {
	    allvertices.push_back(*v);
	}

	// we could do the same thing with the STL algorithm copy
	std::list<HepMC::GenVertex*> allvertices2;
	copy( evt->vertices_begin(), evt->vertices_end(), 
	      back_inserter(allvertices2) );

	// fill a list of all final state particles in the event, by requiring
	// that each particle satisfyies the IsStateFinal predicate
	IsStateFinal isfinal;
	std::list<HepMC::GenParticle*> finalstateparticles;
	for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin();
	      p != evt->particles_end(); ++p ) {
	    if ( isfinal(*p) ) finalstateparticles.push_back(*p);
	}

	// an STL-like algorithm called HepMC::copy_if is provided in the
	// GenEvent.h header to do this sort of operation more easily,
	// you could get the identical results as above by using:
	std::list<HepMC::GenParticle*> finalstateparticles2;
	HepMC::copy_if( evt->particles_begin(), evt->particles_end(), 
			back_inserter(finalstateparticles2), IsStateFinal() );

	// lets print all photons in the event that satisfy the IsPhoton criteria
	IsPhoton isphoton;
	for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin();
	      p != evt->particles_end(); ++p ) {
	    if ( isphoton(*p) ) (*p)->print();
	}

	// the GenVertex::particle_iterator and GenVertex::vertex_iterator
	// are slightly different from the GenEvent:: versions, in that
	// the iterator starts at the given vertex, and walks through the attached 
	// vertex returning particles/vertices.
	// Thus only particles/vertices which are in the same graph as the given
	// vertex will be returned. A range is specified with these iterators,
	// the choices are:
	//    parents, children, family, ancestors, descendants, relatives 
	// here are some examples.

	// use GenEvent::particle_iterator to find all W's in the event,
	// then 
	// (1) for each W user the GenVertex::particle_iterator with a range of
	//     parents to return and print the immediate mothers of these W's.
	// (2) for each W user the GenVertex::particle_iterator with a range of
	//     descendants to return and print all descendants of these W's.
	IsW_Boson isw;
	for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin();
	      p != evt->particles_end(); ++p ) {
	    if ( isw(*p) ) {
		std::cout << "A W boson has been found: " << std::endl;
		(*p)->print();
		// return all parents
		// we do this by pointing to the production vertex of the W 
		// particle and asking for all particle parents of that vertex
		std::cout << "\t Its parents are: " << std::endl;
		if ( (*p)->production_vertex() ) {
		    for ( HepMC::GenVertex::particle_iterator mother 
			      = (*p)->production_vertex()->
			      particles_begin(HepMC::parents);
			  mother != (*p)->production_vertex()->
			      particles_end(HepMC::parents); 
			  ++mother ) {
			std::cout << "\t";
			(*mother)->print();
		    }
		}
		// return all descendants
		// we do this by pointing to the end vertex of the W 
		// particle and asking for all particle descendants of that vertex
		std::cout << "\t\t Its descendants are: " << std::endl;
		if ( (*p)->end_vertex() ) {
		    for ( HepMC::GenVertex::particle_iterator des 
			      =(*p)->end_vertex()->
			      particles_begin(HepMC::descendants);
			  des != (*p)->end_vertex()->
			      particles_end(HepMC::descendants);
			  ++des ) {
			std::cout << "\t\t";
			(*des)->print();
		    }
		}
	    }
	}
	// cleanup
        delete evt;
	// in analogy to the above, similar use can be made of the
	// HepMC::GenVertex::vertex_iterator, which also accepts a range.
    } // end scope of ascii_in

    return 0;
}