HepMC Reference Documentation

HepMC

testMultipleCopies.cc.in

Multiple events in memory at the same time run with valgrind or some other leak checker

00001 
00002 // testMultipleCopies.cc.in
00003 //
00004 // garren@fnal.gov, January 2008
00005 // Multiple events in memory at the same time
00006 // run with valgrind or some other leak checker
00008 //
00009 
00010 #include <fstream>
00011 
00012 #include "HepMC/IO_GenEvent.h"
00013 #include "HepMC/GenEvent.h"
00014 #include "HepMC/CompareGenEvent.h"
00015 
00016 // define methods and classes used by this test
00017 #include "IsGoodEvent.h"
00018 
00019 int main() { 
00020     // use output file
00021     std::ofstream os( "testMultipleCopies.out" );
00022     {
00023         // declare an input strategy
00024         HepMC::IO_GenEvent ascii_in("@srcdir@/testIOGenEvent.input",std::ios::in);
00025         // declare another input strategy 
00026         HepMC::IO_GenEvent ascii_in2("@srcdir@/testHepMCVarious.input",std::ios::in);
00027         std::ofstream out1( "testMultipleOriginals.out" );
00028         std::ofstream out2( "testMultipleCopies1.out" );
00029         std::ofstream out3( "testMultipleCopies2.out" );
00030         // declare an instance of the event selection predicate
00031         IsGoodEvent is_good_event;
00032 
00033         //........................................EVENT LOOP
00034         int icount=0;
00035         int num_good_events=0;
00036         int icnt;
00037         HepMC::GenEvent* evt1 = ascii_in.read_next_event();
00038         HepMC::GenEvent* evt2 = ascii_in2.read_next_event();
00039         HepMC::GenEvent* evt3 = ascii_in.read_next_event();
00040 
00041         while ( evt1 && evt2 ) {
00042             icount++;
00043             if ( icount%50==1 ) os << "Processing Event Number " << icount
00044                                    << " stream 1 # " << evt1->event_number() 
00045                                    << " stream 2 # " << evt2->event_number() 
00046                                    << std::endl;
00047 
00048             if ( is_good_event(evt1) ) {
00049 
00050                 os << "good event in stream 1 # " 
00051                    << evt1->event_number() << std::endl;
00052                 evt1->print(out1);
00053                 ++num_good_events;
00054                 HepMC::GenEvent ec = (*evt1);
00055                 ec.print(out3);
00056                 icnt=0;
00057                 for ( HepMC::GenEvent::particle_const_iterator p1 =  ec.particles_begin();
00058                       p1 !=  ec.particles_end(); ++p1 ) {
00059                       ++icnt;
00060                     os << "particle " << icnt << " barcode " <<(*p1)->barcode() << std::endl;
00061                 }
00062                 HepMC::GenEvent* evt4 = new HepMC::GenEvent(*evt1);
00063                 evt4->print(out2);
00064                 if( !compareGenEvent(evt1,evt4) ) { return -1; }
00065                 delete evt4;
00066             }
00067 
00068             // clean up and get next events
00069             delete evt1;
00070             delete evt2;
00071             ascii_in >> evt1;
00072             ascii_in2 >> evt2;
00073         }
00074         // might have either evt1 or evt2 still in memory, cleanup here
00075         delete evt1;
00076         delete evt2;
00077         delete evt3;
00078 
00079         //........................................PRINT RESULT
00080         os << std::endl;
00081         os << num_good_events << " out of " << icount 
00082            << " processed events passed the cuts." << std::endl;
00083         os << std::endl;
00084         os << " GenEvent copy constructor passes the test" << std::endl;
00085         os << std::endl;
00086     }
00087 
00088     // test operator= and swap
00089     {
00090         // declare an input strategy
00091         HepMC::IO_GenEvent ascii_in("@srcdir@/testIOGenEvent.input",std::ios::in);
00092         //
00093         HepMC::GenEvent* evt5 = ascii_in.read_next_event();
00094         HepMC::GenEvent* evt6 = new HepMC::GenEvent();
00095         os << "event number for evt5: " << evt5->event_number() << std::endl;
00096         os << "event number for evt6: " << evt6->event_number() << std::endl;
00097         // copy  GenEvent object
00098         (*evt6) = (*evt5);
00099         if( !compareGenEvent(evt5,evt6) ) { return -4; }
00100         delete evt5;
00101         os << "event number for evt6 after copy: " << evt6->event_number() << std::endl;
00102         os << std::endl;
00103         delete evt6;
00104         os << " GenEvent operator= passes the test" << std::endl;
00105         os << std::endl;
00106         
00107         evt5 = ascii_in.read_next_event();
00108         evt6 = ascii_in.read_next_event();
00109         HepMC::GenEvent* evt7 = new HepMC::GenEvent(*evt5);
00110         HepMC::GenEvent* evt8 = new HepMC::GenEvent(*evt6);
00111         os << "event number for evt5: " << evt5->event_number() << std::endl;
00112         os << "event number for evt6: " << evt6->event_number() << std::endl;
00113         os << "before swap, evt5 has: " << evt5->vertices_size() << " vertices and "
00114            << evt5->particles_size() << " particles" << std::endl;
00115         os << "before swap, evt6 has: " << evt6->vertices_size() << " vertices and "
00116            << evt6->particles_size() << " particles" << std::endl;
00117         os << "before swap, evt7 has: " << evt7->vertices_size() << " vertices and "
00118            << evt7->particles_size() << " particles" << std::endl;
00119         os << "before swap, evt8 has: " << evt8->vertices_size() << " vertices and "
00120            << evt8->particles_size() << " particles" << std::endl;
00121         (*evt6).swap((*evt5));
00122         os << "event number for evt5 after swap: " << evt5->event_number() << std::endl;
00123         os << "event number for evt6 after swap: " << evt6->event_number() << std::endl;
00124         // evt6 should now match evt7
00125         os << "after swap, evt6 has: " << evt6->vertices_size() << " vertices and "
00126            << evt6->particles_size() << " particles" << std::endl;
00127         os << "after swap, evt7 has: " << evt7->vertices_size() << " vertices and "
00128            << evt7->particles_size() << " particles" << std::endl;
00129         if( !compareGenEvent(evt6,evt7) ) { return -6; }
00130         // evt5 should now match evt8
00131         os << "after swap, evt5 has: " << evt5->vertices_size() << " vertices and "
00132            << evt5->particles_size() << " particles" << std::endl;
00133         os << "after swap, evt8 has: " << evt8->vertices_size() << " vertices and "
00134            << evt8->particles_size() << " particles" << std::endl;
00135         if( !compareGenEvent(evt5,evt8) ) { return -5; }
00136         // cleanup
00137         delete evt5;
00138         delete evt6;
00139         delete evt7;
00140         delete evt8;
00141         os << std::endl;
00142         os << " GenEvent swap passes the test" << std::endl;
00143         os << std::endl;
00144     }
00145     return 0;
00146 }

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