00001
00002
00003
00004
00005
00007
00008
00009 #include <iostream>
00010
00011 #include "HepMC/CompareGenEvent.h"
00012 #include "HepMC/GenEvent.h"
00013
00014 namespace HepMC {
00015
00016 bool compareGenEvent( GenEvent* e1, GenEvent* e2)
00017 {
00018
00019
00020 if( e1->event_number() != e2->event_number() ) {
00021 std::cerr << "compareGenEvent: event numbers differ " << std::endl;
00022 return false;
00023 }
00024 if( e1->signal_process_id() != e2->signal_process_id() ) {
00025 std::cerr << "compareGenEvent: signal process ids differ " << std::endl;
00026 return false;
00027 }
00028 if( e1->event_scale() != e2->event_scale() ) {
00029 std::cerr << "compareGenEvent: event scales differ " << std::endl;
00030 return false;
00031 }
00032 if( e1->alphaQCD() != e2->alphaQCD() ) {
00033 std::cerr << "compareGenEvent: alphaQCD differs " << std::endl;
00034 return false;
00035 }
00036 if( e1->alphaQED() != e2->alphaQED() ) {
00037 std::cerr << "alphaQED differs " << std::endl;
00038 return false;
00039 }
00040 if( e1->mpi() != e2->mpi() ) {
00041 std::cerr << "compareGenEvent: mpi differs " << std::endl;
00042 return false;
00043 }
00044 if ( !compareSignalProcessVertex( e1, e2 ) ) { return false; }
00045 if ( !compareBeamParticles( e1, e2 ) ) { return false; }
00046 if ( !compareWeights( e1, e2 ) ) { return false; }
00047 if( e1->random_states() != e2->random_states() ) {
00048 std::cerr << "compareGenEvent: random states differ " << std::endl;
00049 return false;
00050 }
00051 if( e1->heavy_ion() != e2->heavy_ion() ) {
00052 std::cerr << "compareGenEvent: heavy ions differ " << std::endl;
00053 return false;
00054 }
00055 if( e1->pdf_info() != e2->pdf_info() ) {
00056 std::cerr << "compareGenEvent: pdf info differs " << std::endl;
00057 return false;
00058 }
00059 if ( !compareParticles( e1, e2 ) ) { return false; }
00060 if ( !compareVertices( e1, e2 ) ) { return false; }
00061 return true;
00062 }
00063
00064 bool compareSignalProcessVertex( GenEvent* e1, GenEvent* e2 ) {
00065
00066 GenVertex* s1 = e1->signal_process_vertex();
00067 GenVertex* s2 = e2->signal_process_vertex();
00068 if( s1 && s2 ) {
00069 if( (*s1) != (*s2) ) {
00070 std::cerr << "compareSignalProcessVertex: signal process vertices differ " << std::endl;
00071 return false;
00072 }
00073 }
00074 return true;
00075 }
00076
00077 bool compareBeamParticles( GenEvent* e1, GenEvent* e2 ) {
00078 GenParticle* e1b1 = e1->beam_particles().first;
00079 GenParticle* e1b2 = e1->beam_particles().second;
00080 GenParticle* e2b1 = e2->beam_particles().first;
00081 GenParticle* e2b2 = e2->beam_particles().second;
00082 if( e1b1 && e1b2 && e2b1 && e2b2 ) {
00083 if( (*e1b1) == (*e2b1) && (*e1b2) == (*e2b2) ) {
00084 } else {
00085 std::cerr << "compareBeamParticles: beam particles differ " << std::endl;
00086 return false;
00087 }
00088 }
00089 return true;
00090 }
00091
00092 bool compareWeights( GenEvent* e1, GenEvent* e2 ) {
00093 WeightContainer w1 = e1->weights();
00094 WeightContainer w2 = e2->weights();
00095 if( w1.size() != w2.size() ) {
00096 std::cerr << "compareWeights: size of weight container differs " << std::endl;
00097 return false;
00098 }
00099 for( int i=0; i<w1.size(); ++i ) {
00100 if( w1[i] != w2[i] ) {
00101 std::cerr << "compareWeights: weight container entry "
00102 << i << " differs" << std::endl;
00103 return false;
00104 }
00105 }
00106 return true;
00107 }
00108
00109 bool compareParticles( GenEvent* e1, GenEvent* e2 ) {
00110 if( e1->particles_size() != e2->particles_size() ) {
00111 std::cerr << "compareParticles: number of particles differs " << std::endl;
00112 return false;
00113 }
00114 if( e1->particles_size() == 0 ) { return true; }
00115 for ( GenEvent::particle_const_iterator p1 = e1->particles_begin(),
00116 p2 = e2->particles_begin();
00117 p1 != e1->particles_end(); ++p1, ++p2 ) {
00118
00119
00120
00121 if ( **p1 != **p2 ) {
00122 std::cerr << "compareParticles: particle "
00123 << (*p1)->barcode() << " differs from "
00124 << (*p2)->barcode() << std::endl;
00125 return false;
00126 }
00127 }
00128 return true;
00129 }
00130
00131 bool compareVertices( GenEvent* e1, GenEvent* e2 ) {
00132 if( e1->vertices_size() != e2->vertices_size() ) {
00133 std::cerr << "compareVertices: number of vertices differs " << std::endl;
00134 return false;
00135 }
00136 for ( GenEvent::vertex_const_iterator v = e1->vertices_begin();
00137 v != e1->vertices_end(); ++v ) {
00138
00139
00140 GenVertex* v1 = (*v);
00141 GenVertex* v2 = e2->barcode_to_vertex((*v)->barcode());
00142 compareVertex( (*v), e2->barcode_to_vertex((*v)->barcode()));
00143 if ( (*v1) != (*v2) ) {
00144 std::cerr << "compareVertices: vertex "
00145 << (*v)->barcode() << " differs" << std::endl;
00146 return false;
00147 }
00148 }
00149 return true;
00150 }
00151
00152 bool compareVertex( GenVertex* v1, GenVertex* v2 ) {
00153 if ( v1->position() != v2->position() ) {
00154 std::cerr << "compareVertex: position "
00155 << v1->barcode() << " differs" << std::endl;
00156 return false;
00157 }
00158
00159 if ( v1->particles_in_size() != v2->particles_in_size() ) {
00160 std::cerr << "compareVertex: particles_in_size "
00161 << v1->barcode() << " differs" << std::endl;
00162 return false;
00163 }
00164
00165 if ( v1->particles_in_const_begin() != v1->particles_in_const_end() ) {
00166 for ( GenVertex::particles_in_const_iterator
00167 ia = v1->particles_in_const_begin(),
00168 ib = v2->particles_in_const_begin();
00169 ia != v1->particles_in_const_end(); ia++, ib++ ){
00170 if ( **ia != **ib ) {
00171 std::cerr << "compareVertex: incoming particle "
00172 << v1->barcode() << " differs: "
00173 << (*ia)->barcode() << " " << (*ib)->barcode()
00174 << std::endl;
00175
00176 }
00177 }
00178 }
00179
00180 if ( v1->particles_out_size() != v2->particles_out_size() ) {
00181 std::cerr << "compareVertex: particles_out_size "
00182 << v1->barcode() << " differs" << std::endl;
00183 return false;
00184 }
00185
00186 if ( v1->particles_out_const_begin() != v1->particles_out_const_end() ) {
00187 for ( GenVertex::particles_out_const_iterator
00188 ia = v1->particles_out_const_begin(),
00189 ib = v2->particles_out_const_begin();
00190 ia != v1->particles_out_const_end(); ia++, ib++ ){
00191 if ( **ia != **ib ) {
00192 std::cerr << "compareVertex: outgoing particle "
00193 << v1->barcode() << " differs: "
00194 << (*ia)->barcode() << " " << (*ib)->barcode()
00195 << std::endl;
00196
00197 }
00198 }
00199 }
00200 return true;
00201 }
00202
00203 }