Rev 100 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2 | garren | 1 | ////////////////////////////////////////////////////////////////////////// |
| 2 | // Matt.Dobbs@Cern.CH, Feb 2000 |
||
| 3 | // This example shows low to use the particle and vertex iterators |
||
| 4 | ////////////////////////////////////////////////////////////////////////// |
||
| 5 | // To Compile: go to the HepMC directory and type: |
||
| 6 | // gmake examples/example_UsingIterators.exe |
||
| 7 | // |
||
| 8 | |||
| 9 | #include "HepMC/IO_Ascii.h" |
||
| 10 | #include "HepMC/GenEvent.h" |
||
| 11 | #include <math.h> |
||
| 12 | #include <algorithm> |
||
| 13 | #include <list> |
||
| 14 | |||
| 65 | garren | 15 | //! example class |
| 16 | |||
| 17 | /// \class IsPhoton |
||
| 18 | /// this predicate returns true if the input particle is a photon |
||
| 19 | /// in the central region (eta < 2.5) with pT > 10 GeV |
||
| 2 | garren | 20 | class IsPhoton { |
| 21 | public: |
||
| 65 | garren | 22 | /// returns true if the GenParticle is a photon with more than 10 GeV transverse momentum |
| 2 | garren | 23 | bool operator()( const HepMC::GenParticle* p ) { |
| 24 | if ( p->pdg_id() == 22 |
||
| 25 | && p->momentum().perp() > 10. ) return 1; |
||
| 26 | return 0; |
||
| 27 | } |
||
| 28 | }; |
||
| 29 | |||
| 65 | garren | 30 | //! example class |
| 31 | |||
| 32 | /// \class IsW_Boson |
||
| 33 | /// this predicate returns true if the input particle is a W+/W- |
||
| 2 | garren | 34 | class IsW_Boson { |
| 35 | public: |
||
| 65 | garren | 36 | /// returns true if the GenParticle is a W |
| 2 | garren | 37 | bool operator()( const HepMC::GenParticle* p ) { |
| 100 | garren | 38 | if ( abs(p->pdg_id()) == 24 ) return 1; |
| 2 | garren | 39 | return 0; |
| 40 | } |
||
| 41 | }; |
||
| 42 | |||
| 65 | garren | 43 | //! example class |
| 44 | |||
| 179 | garren | 45 | /// \class IsStateFinal |
| 65 | garren | 46 | /// this predicate returns true if the input has no decay vertex |
| 179 | garren | 47 | class IsStateFinal { |
| 2 | garren | 48 | public: |
| 65 | garren | 49 | /// returns true if the GenParticle does not decay |
| 2 | garren | 50 | bool operator()( const HepMC::GenParticle* p ) { |
| 51 | if ( !p->end_vertex() && p->status()==1 ) return 1; |
||
| 52 | return 0; |
||
| 53 | } |
||
| 54 | }; |
||
| 55 | |||
| 56 | int main() { |
||
| 63 | garren | 57 | { // begin scope of ascii_in |
| 58 | // an event has been prepared in advance for this example, read it |
||
| 59 | // into memory using the IO_Ascii input strategy |
||
| 60 | HepMC::IO_Ascii ascii_in("example_UsingIterators.txt",std::ios::in); |
||
| 61 | if ( ascii_in.rdstate() == std::ios::failbit ) { |
||
| 62 | std::cerr << "ERROR input file example_UsingIterators.txt is needed " |
||
| 63 | << "and does not exist. " |
||
| 64 | << "\n Look for it in HepMC/examples, Exit." << std::endl; |
||
| 65 | return 1; |
||
| 66 | } |
||
| 2 | garren | 67 | |
| 63 | garren | 68 | HepMC::GenEvent* evt = ascii_in.read_next_event(); |
| 2 | garren | 69 | |
| 63 | garren | 70 | // if you wish to have a look at the event, then use evt->print(); |
| 2 | garren | 71 | |
| 63 | garren | 72 | // use GenEvent::vertex_iterator to fill a list of all |
| 73 | // vertices in the event |
||
| 74 | std::list<HepMC::GenVertex*> allvertices; |
||
| 75 | for ( HepMC::GenEvent::vertex_iterator v = evt->vertices_begin(); |
||
| 76 | v != evt->vertices_end(); ++v ) { |
||
| 77 | allvertices.push_back(*v); |
||
| 78 | } |
||
| 2 | garren | 79 | |
| 63 | garren | 80 | // we could do the same thing with the STL algorithm copy |
| 81 | std::list<HepMC::GenVertex*> allvertices2; |
||
| 82 | copy( evt->vertices_begin(), evt->vertices_end(), |
||
| 83 | back_inserter(allvertices2) ); |
||
| 2 | garren | 84 | |
| 63 | garren | 85 | // fill a list of all final state particles in the event, by requiring |
| 179 | garren | 86 | // that each particle satisfyies the IsStateFinal predicate |
| 87 | IsStateFinal isfinal; |
||
| 63 | garren | 88 | std::list<HepMC::GenParticle*> finalstateparticles; |
| 89 | for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin(); |
||
| 90 | p != evt->particles_end(); ++p ) { |
||
| 91 | if ( isfinal(*p) ) finalstateparticles.push_back(*p); |
||
| 92 | } |
||
| 2 | garren | 93 | |
| 63 | garren | 94 | // an STL-like algorithm called HepMC::copy_if is provided in the |
| 95 | // GenEvent.h header to do this sort of operation more easily, |
||
| 96 | // you could get the identical results as above by using: |
||
| 97 | std::list<HepMC::GenParticle*> finalstateparticles2; |
||
| 98 | HepMC::copy_if( evt->particles_begin(), evt->particles_end(), |
||
| 179 | garren | 99 | back_inserter(finalstateparticles2), IsStateFinal() ); |
| 2 | garren | 100 | |
| 63 | garren | 101 | // lets print all photons in the event that satisfy the IsPhoton criteria |
| 102 | IsPhoton isphoton; |
||
| 103 | for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin(); |
||
| 104 | p != evt->particles_end(); ++p ) { |
||
| 105 | if ( isphoton(*p) ) (*p)->print(); |
||
| 106 | } |
||
| 2 | garren | 107 | |
| 63 | garren | 108 | // the GenVertex::particle_iterator and GenVertex::vertex_iterator |
| 109 | // are slightly different from the GenEvent:: versions, in that |
||
| 110 | // the iterator starts at the given vertex, and walks through the attached |
||
| 111 | // vertex returning particles/vertices. |
||
| 112 | // Thus only particles/vertices which are in the same graph as the given |
||
| 113 | // vertex will be returned. A range is specified with these iterators, |
||
| 114 | // the choices are: |
||
| 115 | // parents, children, family, ancestors, descendants, relatives |
||
| 116 | // here are some examples. |
||
| 117 | |||
| 118 | // use GenEvent::particle_iterator to find all W's in the event, |
||
| 119 | // then |
||
| 120 | // (1) for each W user the GenVertex::particle_iterator with a range of |
||
| 121 | // parents to return and print the immediate mothers of these W's. |
||
| 122 | // (2) for each W user the GenVertex::particle_iterator with a range of |
||
| 123 | // descendants to return and print all descendants of these W's. |
||
| 124 | IsW_Boson isw; |
||
| 125 | for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin(); |
||
| 126 | p != evt->particles_end(); ++p ) { |
||
| 127 | if ( isw(*p) ) { |
||
| 128 | std::cout << "A W boson has been found: " << std::endl; |
||
| 129 | (*p)->print(); |
||
| 130 | // return all parents |
||
| 131 | // we do this by pointing to the production vertex of the W |
||
| 132 | // particle and asking for all particle parents of that vertex |
||
| 133 | std::cout << "\t Its parents are: " << std::endl; |
||
| 134 | if ( (*p)->production_vertex() ) { |
||
| 135 | for ( HepMC::GenVertex::particle_iterator mother |
||
| 136 | = (*p)->production_vertex()-> |
||
| 137 | particles_begin(HepMC::parents); |
||
| 138 | mother != (*p)->production_vertex()-> |
||
| 139 | particles_end(HepMC::parents); |
||
| 140 | ++mother ) { |
||
| 141 | std::cout << "\t"; |
||
| 142 | (*mother)->print(); |
||
| 143 | } |
||
| 2 | garren | 144 | } |
| 63 | garren | 145 | // return all descendants |
| 146 | // we do this by pointing to the end vertex of the W |
||
| 147 | // particle and asking for all particle descendants of that vertex |
||
| 148 | std::cout << "\t\t Its descendants are: " << std::endl; |
||
| 149 | if ( (*p)->end_vertex() ) { |
||
| 150 | for ( HepMC::GenVertex::particle_iterator des |
||
| 151 | =(*p)->end_vertex()-> |
||
| 152 | particles_begin(HepMC::descendants); |
||
| 153 | des != (*p)->end_vertex()-> |
||
| 154 | particles_end(HepMC::descendants); |
||
| 155 | ++des ) { |
||
| 156 | std::cout << "\t\t"; |
||
| 157 | (*des)->print(); |
||
| 158 | } |
||
| 2 | garren | 159 | } |
| 160 | } |
||
| 161 | } |
||
| 92 | garren | 162 | // cleanup |
| 163 | delete evt; |
||
| 63 | garren | 164 | // in analogy to the above, similar use can be made of the |
| 165 | // HepMC::GenVertex::vertex_iterator, which also accepts a range. |
||
| 166 | } // end scope of ascii_in |
||
| 2 | garren | 167 | |
| 168 | return 0; |
||
| 169 | } |