![]() |
HepMC Reference DocumentationHepMC |
00001 00002 // CompareGenEvent.cc 00003 // 00004 // garren@fnal.gov, January 2008 00005 // Free functions used to compare two copies of GenEvent 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 //std::cout << "compareGenEvent: comparing event " << e1->event_number() << " to event " 00019 // << e2->event_number() << std::endl; 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 // compare signal process vertex 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 /* std::cout << "compareParticles: particle " 00119 << (*p1)->barcode() << " " << (*p2)->barcode() 00120 << std::endl; */ 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 //std::cout << "compareVertices: comparing vertex " 00139 // << (*v)->barcode() << std::endl; 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 // if the size of the inlist differs, return false. 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 // loop over the inlist and ensure particles are identical 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 //return false; 00176 } 00177 } 00178 } 00179 // if the size of the outlist differs, return false. 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 // loop over the outlist and ensure particles are identical 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 //return false; 00197 } 00198 } 00199 } 00200 return true; 00201 } 00202 00203 } // HepMC