HepMC Reference Documentation

HepMC

CompareGenEvent.cc

Go to the documentation of this file.
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

Generated on Thu Jan 7 13:10:15 2010 for HepMC by  doxygen 1.4.7