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    if( e1->weights() == e2->weights() ) return true;
00094    std::cerr << "compareWeights: weight containers differ " << std::endl;
00095    return false;
00096 }
00097 
00098 bool compareParticles( GenEvent* e1, GenEvent* e2 ) {
00099    if( e1->particles_size() != e2->particles_size() ) { 
00100        std::cerr << "compareParticles: number of particles differs " << std::endl;
00101        return false; 
00102    }
00103    if( e1->particles_size() == 0 ) { return true; }
00104    for ( GenEvent::particle_const_iterator p1 =  e1->particles_begin(),
00105          p2 = e2->particles_begin();
00106          p1 !=  e1->particles_end(); ++p1, ++p2 ) {
00107        /* std::cout << "compareParticles: particle " 
00108                  << (*p1)->barcode() << " " << (*p2)->barcode()
00109                  << std::endl; */
00110        if ( **p1 != **p2 ) {
00111            std::cerr << "compareParticles: particle " 
00112                      << (*p1)->barcode() << " differs from " 
00113                      << (*p2)->barcode() << std::endl;
00114            return false; 
00115        }
00116    }
00117    return true;
00118 }
00119 
00120 bool compareVertices( GenEvent* e1, GenEvent* e2 ) {
00121    if( e1->vertices_size() != e2->vertices_size() ) { 
00122        std::cerr << "compareVertices: number of vertices differs " << std::endl;
00123        return false; 
00124    }
00125    for ( GenEvent::vertex_const_iterator v =  e1->vertices_begin();
00126          v !=  e1->vertices_end(); ++v ) {
00127        //std::cout << "compareVertices:  comparing vertex " 
00128         //         << (*v)->barcode() << std::endl;
00129        GenVertex* v1 = (*v);
00130        GenVertex* v2 = e2->barcode_to_vertex((*v)->barcode());
00131        compareVertex( (*v), e2->barcode_to_vertex((*v)->barcode()));
00132        if ( (*v1) != (*v2) ) {
00133            std::cerr << "compareVertices: vertex " 
00134                      << (*v)->barcode() << " differs" << std::endl;
00135            return false; 
00136        }
00137    }
00138    return true;
00139 }
00140 
00141 bool compareVertex( GenVertex* v1, GenVertex* v2 ) {
00142        if ( v1->position() !=  v2->position() ) {
00143           std::cerr << "compareVertex: position " 
00144                     << v1->barcode() << " differs" << std::endl;
00145           return false; 
00146        }
00147        // if the size of the inlist differs, return false.
00148        if ( v1->particles_in_size() !=  v2->particles_in_size() ) {
00149           std::cerr << "compareVertex: particles_in_size " 
00150                     << v1->barcode() << " differs" << std::endl;
00151           return false; 
00152        }
00153        // loop over the inlist and ensure particles are identical
00154        if ( v1->particles_in_const_begin() != v1->particles_in_const_end() ) {
00155            for ( GenVertex::particles_in_const_iterator 
00156                     ia = v1->particles_in_const_begin(),
00157                     ib = v2->particles_in_const_begin();
00158                 ia != v1->particles_in_const_end(); ia++, ib++ ){
00159               if ( **ia != **ib ) {
00160                  std::cerr << "compareVertex: incoming particle " 
00161                            << v1->barcode() << " differs: " 
00162                            << (*ia)->barcode() << " " << (*ib)->barcode()
00163                            << std::endl;
00164                   //return false; 
00165               }
00166            }
00167        }
00168        // if the size of the outlist differs, return false.
00169        if ( v1->particles_out_size() !=  v2->particles_out_size() ) {
00170           std::cerr << "compareVertex: particles_out_size " 
00171                     << v1->barcode() << " differs" << std::endl;
00172           return false; 
00173        }
00174        // loop over the outlist and ensure particles are identical
00175        if ( v1->particles_out_const_begin() != v1->particles_out_const_end() ) {
00176            for ( GenVertex::particles_out_const_iterator 
00177                      ia = v1->particles_out_const_begin(),
00178                      ib = v2->particles_out_const_begin();
00179                  ia != v1->particles_out_const_end(); ia++, ib++ ){
00180                if ( **ia != **ib ) {
00181                    std::cerr << "compareVertex: outgoing particle " 
00182                              << v1->barcode() << " differs: " 
00183                              << (*ia)->barcode() << " " << (*ib)->barcode()
00184                              << std::endl;
00185                    //return false; 
00186                }
00187            }
00188        }
00189    return true;
00190 }
00191 
00192 } // HepMC

Generated on Fri Feb 17 00:31:25 2012 for HepMC by  doxygen 1.4.7