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