![]() |
HepMC Reference DocumentationHepMC |
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 }