]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/HepMC/CompareGenEvent.cc
Updates EvtGen Code
[u/mrichter/AliRoot.git] / TEvtGen / HepMC / CompareGenEvent.cc
1 /////////////////////////////////////////////////////////////////////////
2 // CompareGenEvent.cc
3 //
4 // garren@fnal.gov, January 2008
5 // Free functions used to compare two copies of GenEvent
6 //////////////////////////////////////////////////////////////////////////
7 //
8
9 #include <iostream>
10
11 #include "HepMC/CompareGenEvent.h"
12 #include "HepMC/GenEvent.h"
13
14 namespace HepMC {
15
16 bool compareGenEvent( GenEvent* e1, GenEvent* e2)
17 {
18    //std::cout << "compareGenEvent: comparing event " << e1->event_number() << " to event " 
19    //          << e2->event_number() << std::endl;
20    if( e1->event_number() != e2->event_number() ) { 
21        std::cerr << "compareGenEvent: event numbers differ " << std::endl;
22        return false; 
23    }
24    if( e1->signal_process_id() != e2->signal_process_id() ) { 
25        std::cerr << "compareGenEvent: signal process ids differ " << std::endl;
26        return false; 
27    }
28    if( e1->event_scale() != e2->event_scale() ) { 
29        std::cerr << "compareGenEvent: event scales differ " << std::endl;
30        return false; 
31    }
32    if( e1->alphaQCD() != e2->alphaQCD() ) { 
33        std::cerr << "compareGenEvent: alphaQCD differs " << std::endl;
34        return false; 
35    }
36    if( e1->alphaQED() != e2->alphaQED() ) { 
37        std::cerr << "alphaQED differs " << std::endl;
38        return false; 
39    }
40    if( e1->mpi() != e2->mpi() ) { 
41        std::cerr << "compareGenEvent: mpi differs " << std::endl;
42        return false; 
43    }
44    if ( !compareSignalProcessVertex( e1, e2 ) ) { return false; }
45    if ( !compareBeamParticles( e1, e2 ) ) { return false; }
46    if ( !compareWeights( e1, e2 ) ) { return false; }
47    if( e1->random_states() != e2->random_states() ) { 
48        std::cerr << "compareGenEvent: random states differ " << std::endl;
49        return false; 
50    }
51    if( e1->heavy_ion() != e2->heavy_ion() ) { 
52        std::cerr << "compareGenEvent: heavy ions differ " << std::endl;
53        return false; 
54    }
55    if( e1->pdf_info() != e2->pdf_info() ) { 
56        std::cerr << "compareGenEvent: pdf info differs " << std::endl;
57        return false; 
58    }
59    if ( !compareParticles( e1, e2 ) ) { return false; }
60    if ( !compareVertices( e1, e2 ) ) { return false; }
61    return true;
62 }
63
64 bool compareSignalProcessVertex( GenEvent* e1, GenEvent* e2 ) {
65    // compare signal process vertex
66    GenVertex* s1 = e1->signal_process_vertex();
67    GenVertex* s2 = e2->signal_process_vertex();
68    if( s1 && s2 ) {
69        if( (*s1) != (*s2) ) { 
70            std::cerr << "compareSignalProcessVertex: signal process vertices differ " << std::endl;
71            return false; 
72        }
73    }
74    return true;
75 }
76
77 bool compareBeamParticles( GenEvent* e1, GenEvent* e2 ) {
78    GenParticle* e1b1 = e1->beam_particles().first;
79    GenParticle* e1b2 = e1->beam_particles().second;
80    GenParticle* e2b1 = e2->beam_particles().first;
81    GenParticle* e2b2 = e2->beam_particles().second;
82    if( e1b1 && e1b2 && e2b1 && e2b2 ) {
83        if( (*e1b1) == (*e2b1)  && (*e1b2) == (*e2b2) ) {
84        } else { 
85            std::cerr << "compareBeamParticles: beam particles differ " << std::endl;
86            return false; 
87        }
88    }
89    return true;
90 }
91
92 bool compareWeights( GenEvent* e1, GenEvent* e2 ) {
93    if( e1->weights() == e2->weights() ) return true;
94    std::cerr << "compareWeights: weight containers differ " << std::endl;
95    return false;
96 }
97
98 bool compareParticles( GenEvent* e1, GenEvent* e2 ) {
99    if( e1->particles_size() != e2->particles_size() ) { 
100        std::cerr << "compareParticles: number of particles differs " << std::endl;
101        return false; 
102    }
103    if( e1->particles_size() == 0 ) { return true; }
104    for ( GenEvent::particle_const_iterator p1 =  e1->particles_begin(),
105          p2 = e2->particles_begin();
106          p1 !=  e1->particles_end(); ++p1, ++p2 ) {
107        /* std::cout << "compareParticles: particle " 
108                  << (*p1)->barcode() << " " << (*p2)->barcode()
109                  << std::endl; */
110        if ( **p1 != **p2 ) {
111            std::cerr << "compareParticles: particle " 
112                      << (*p1)->barcode() << " differs from " 
113                      << (*p2)->barcode() << std::endl;
114            return false; 
115        }
116    }
117    return true;
118 }
119
120 bool compareVertices( GenEvent* e1, GenEvent* e2 ) {
121    if( e1->vertices_size() != e2->vertices_size() ) { 
122        std::cerr << "compareVertices: number of vertices differs " << std::endl;
123        return false; 
124    }
125    for ( GenEvent::vertex_const_iterator v =  e1->vertices_begin();
126          v !=  e1->vertices_end(); ++v ) {
127        //std::cout << "compareVertices:  comparing vertex " 
128         //         << (*v)->barcode() << std::endl;
129        GenVertex* v1 = (*v);
130        GenVertex* v2 = e2->barcode_to_vertex((*v)->barcode());
131        compareVertex( (*v), e2->barcode_to_vertex((*v)->barcode()));
132        if ( (*v1) != (*v2) ) {
133            std::cerr << "compareVertices: vertex " 
134                      << (*v)->barcode() << " differs" << std::endl;
135            return false; 
136        }
137    }
138    return true;
139 }
140
141 bool compareVertex( GenVertex* v1, GenVertex* v2 ) {
142        if ( v1->position() !=  v2->position() ) {
143           std::cerr << "compareVertex: position " 
144                     << v1->barcode() << " differs" << std::endl;
145           return false; 
146        }
147        // if the size of the inlist differs, return false.
148        if ( v1->particles_in_size() !=  v2->particles_in_size() ) {
149           std::cerr << "compareVertex: particles_in_size " 
150                     << v1->barcode() << " differs" << std::endl;
151           return false; 
152        }
153        // loop over the inlist and ensure particles are identical
154        if ( v1->particles_in_const_begin() != v1->particles_in_const_end() ) {
155            for ( GenVertex::particles_in_const_iterator 
156                     ia = v1->particles_in_const_begin(),
157                     ib = v2->particles_in_const_begin();
158                 ia != v1->particles_in_const_end(); ia++, ib++ ){
159               if ( **ia != **ib ) {
160                  std::cerr << "compareVertex: incoming particle " 
161                            << v1->barcode() << " differs: " 
162                            << (*ia)->barcode() << " " << (*ib)->barcode()
163                            << std::endl;
164                   //return false; 
165               }
166            }
167        }
168        // if the size of the outlist differs, return false.
169        if ( v1->particles_out_size() !=  v2->particles_out_size() ) {
170           std::cerr << "compareVertex: particles_out_size " 
171                     << v1->barcode() << " differs" << std::endl;
172           return false; 
173        }
174        // loop over the outlist and ensure particles are identical
175        if ( v1->particles_out_const_begin() != v1->particles_out_const_end() ) {
176            for ( GenVertex::particles_out_const_iterator 
177                      ia = v1->particles_out_const_begin(),
178                      ib = v2->particles_out_const_begin();
179                  ia != v1->particles_out_const_end(); ia++, ib++ ){
180                if ( **ia != **ib ) {
181                    std::cerr << "compareVertex: outgoing particle " 
182                              << v1->barcode() << " differs: " 
183                              << (*ia)->barcode() << " " << (*ib)->barcode()
184                              << std::endl;
185                    //return false; 
186                }
187            }
188        }
189    return true;
190 }
191
192 } // HepMC