LCIO  02.17
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_randomaccess.cc
Go to the documentation of this file.
1 // example for LCIO tests
4 
5 #include "tutil.h"
6 #include "lcio.h"
7 #include <cstdlib>
8 
9 // #include "EVENT/LCIO.h"
10 // #include "IO/LCWriter.h"
11 // #include "IMPL/LCEventImpl.h"
12 
13 
14 #include "IMPL/LCRunHeaderImpl.h"
15 
16 #include "SIO/LCIORandomAccess.h"
18 #include "SIO/RunEventMap.h"
19 
20 #include "UTIL/LCTOOLS.h"
21 
22 #include <iostream>
23 #include <set>
24 #include <vector>
25 #include <algorithm>
26 
27 using namespace std ;
28 using namespace lcio ;
29 
30 using namespace SIO ;
31 
32 // replace mytest with the name of your test
33 const static string testname="random_access";
34 
35 //=============================================================================
36 
37 int main(int /*argc*/, char** /*argv*/ ){
38 
39  // this should be the first line in your test
40  TEST MYTEST=TEST( testname, std::cout );
41 
42 
43  MYTEST.LOG( " ---------------------------- testing class RunEvent" ) ;
44 
45  // fill a few RunEvents into a set - test ordering with operator<()
46 
47  set< RunEvent > reSet ;
48  reSet.insert( RunEvent( 123456, -1 ) ) ;
49  reSet.insert( RunEvent( 123456, 1 ) ) ;
50  reSet.insert( RunEvent( 123456, 12 ) ) ;
51  reSet.insert( RunEvent( 123450, -1 ) ) ;
52  reSet.insert( RunEvent( 123450, 112345 ) ) ;
53 
54  reSet.insert( EVENT::long64(123400) << 32 | (12345678LL & 0xffffffff) ) ;
55 
56  MYTEST( reSet.size() , unsigned(6) , " set< RunEvent>.size() != 6 " ) ;
57 
58  std::vector< RunEvent > v ; // copy to vector for easier comparison
59  std::copy( reSet.begin() , reSet.end() , std::back_inserter( v ) ) ;
60 
61 // int d=-1 ;
62 // for( std::set< RunEvent >::iterator it = reSet.begin() ; it != reSet.end() ; ++it ){
63 // std::cout << " set[" << ++d <<"] " << *it << std::endl ;
64 // }
65 
66  std::stringstream err ;
67  err << " v[0] : " << v[0] << std::endl
68  << " v[1] : " << v[1] << std::endl
69  << " v[2] : " << v[2] << std::endl
70  << " v[3] : " << v[3] << std::endl
71  << " v[4] : " << v[4] << std::endl
72  << " v[5] : " << v[5] << std::endl ;
73 
74  MYTEST( v[0] < v[1] , true , err.str() ) ;
75  MYTEST( v[1] < v[2] , true , err.str() ) ;
76  MYTEST( v[2] < v[3] , true , err.str() ) ;
77  MYTEST( v[3] < v[4] , true , err.str() ) ;
78  MYTEST( v[4] < v[5] , true , err.str() ) ;
79 
80 
81  MYTEST.LOG( " ------------------------------------- testing class RunEventMap" ) ;
82 
84 
85  int count = 0 ;
86  for( std::set< RunEvent >::iterator it = reSet.begin() ; it != reSet.end() ; ++it , ++count ){
87 
88  // std::cout << " set[" << count <<"] " << *it << std::endl ;
89  map.add( *it , 1024 * count ) ;
90  }
91  MYTEST( map.getPosition( v[2] ), 2048 , " EventMap::getPosition() return for exisiting event " ) ;
92 
93  MYTEST( unsigned (map.getNumberOfRunRecords() + map.getNumberOfEventRecords() ),
94  map.size(), "RunEventMap invariant: nRun+nEvt = map.size " );
95 
96  MYTEST( map.getNumberOfEventRecords(), 4 , "RunEventMap::getNumberOfEventRecords() " );
97  MYTEST( map.getNumberOfRunRecords(), 2 , "RunEventMap::getNumberOfRunRecords() " );
98 
99  map.add( v[2] , 2048000 ) ; // overwrite existing entry
100 
101  MYTEST( map.getPosition( v[2] ), 2048000 , " test if EventMap::add() overwrites existing entry " ) ;
102 
103  MYTEST( map.getNumberOfEventRecords(), 4 , "RunEventMap::getNumberOfEventRecords() after addition of duplicate (overwrite) " );
104 
105 
106 
107  //if( true ){
108  if( false ){
109  // force test program to fail in this way:
110  MYTEST.FAILED( "oops, something went wrong..." );
111  }
112 
113 
114  MYTEST.LOG( " ------------------------------------- test random access in file c_sim.slcio - file must exist in : " ) ;
115  if( !std::system("pwd") )
116  std::cout << "?" << std::endl ;
117 
118  // simjob.slcio has written 100 events in 10 runs, closing and re-opening the file after every run
119  // this tests writing the random access records in append mode ...
120  // here we make just one simple test of reading a given event
121 
122  LCReader* lcReader = LCFactory::getInstance()->createLCReader( IO::LCReader::directAccess ) ;
123 
124  // LCReader* lcReader = LCFactory::getInstance()->createLCReader( ) ;
125 
126  try{
127 
128  lcReader->open( "c_sim.slcio" ) ;
129 
130  MYTEST( lcReader->getNumberOfRuns() , 10 , " LCReader::getNumberOfRuns() - number of run headers is not 10" );
131 
132  MYTEST( lcReader->getNumberOfEvents() , 100 , " LCReader::getNumberOfEvents() - number of events is not 100" );
133 
134 
135  IntVec runs ;
136  IntVec events ;
137 
138  lcReader->getRuns( runs ) ;
139  lcReader->getEvents( events ) ;
140 
141  MYTEST( runs.size() , 10u , " LCReader::getRuns( runs ) - size 'runs' is not 10" );
142 
143  MYTEST( events.size() , 200u , " LCReader::getEvents( events ) - size of 'events' is not 200" );
144 
145  // for(int i=0,nElements= events.size() /2 ; i < nElements ; ++i){
146  // std::cout << " test_random_access - i*2 = " << i*2 << " runnum = "
147  // << events[ 2*i ] << " 2*i + 1 " << 2*i + 1 << " evtnum = " << events[ 2*i + 1 ] << std::endl ;
148  // }
149 
150  MYTEST( events[ 42 * 2 ], 4 , " LCReader::getEvents( events ) - events[ 42 * 2 ] is not run 4 " );
151 
152  MYTEST( events[ 42 * 2 + 1 ], 2 , " LCReader::getEvents( events ) - events[ 42 * 2 +1 ] is not event 2 " );
153 
154 
155  // test that we can still use read next for runheaders .....
156  LCRunHeader* rHdr = lcReader->readNextRunHeader() ;
157  MYTEST( rHdr->getRunNumber() , 0 , " LCReader::readNextRunHeader() - run number is not 0" );
158 
159  LCEvent* evt = lcReader->readNextEvent() ;
160  MYTEST( evt->getEventNumber() , 0 , " LCReader::readNextEvent() - event number is not 0" );
161  MYTEST( evt->getRunNumber() , 0 , " LCReader::readNextEvent() - run number is not 0" );
162 
163 
164  evt = lcReader->readEvent( 3 , 4 ) ;
165 
166  MYTEST( evt !=0 , true , " LCReader::readEvent( 3 , 4 ) - evt is NULL" );
167  MYTEST( evt->getRunNumber() , 3 , " LCReader::readEvent( 3, 4 ) - run number is not 3" );
168  MYTEST( evt->getEventNumber() , 4 , " LCReader::readEvent( 3, 4 ) - event number is not 4" );
169 
170 
171 
172  // test direct access of run headers
173  rHdr = lcReader->readRunHeader( 7 ) ;
174  MYTEST( rHdr->getRunNumber() , 7 , " LCReader::readRunHeader() - run number is not 7" );
175  rHdr = lcReader->readRunHeader( 3 ) ;
176  MYTEST( rHdr->getRunNumber() , 3 , " LCReader::readRunHeader() - run number is not 3" );
177 
178  rHdr = lcReader->readRunHeader( 0 , EVENT::LCIO::UPDATE ) ;
179  //rHdr = lcReader->readRunHeader( 0 ) ;
180  IMPL::LCRunHeaderImpl* rhImpl = dynamic_cast< IMPL::LCRunHeaderImpl*> ( rHdr ) ;
181  bool notNull = rhImpl != 0 ;
182  MYTEST( notNull , true , " readRunHeader not of type IMPL::LCRunHeaderImpl " );
183 
184  rhImpl->setRunNumber( 42 ) ;
185  MYTEST( rHdr->getRunNumber() , 42 , " LCReader::readRunHeader() - run number to changed to 42 in update mode " );
186 
187 
188  }
189  catch( Exception &e ){
190 
191  MYTEST.FAILED( e.what() );
192  }
193 
194  lcReader->close();
195 
196  delete lcReader;
198 
199  return 0;
200 }
201 
202 //=============================================================================
203 
T copy(T...args)
T system(T...args)
T endl(T...args)
int getNumberOfRunRecords() const
Definition: RunEventMap.h:79
T end(T...args)
Helper struct that stores run and event positions in the file.
Definition: RunEventMap.h:14
Definition: tutil.h:7
Map that holds positions of Run and Event records.
Definition: RunEventMap.h:37
STL class.
long long long64
64 bit signed integer,e.g.to be used for timestamps
Definition: LCIOTypes.h:14
Implementation of LCRunHeader.
void FAILED(const std::string &msg)
Definition: tutil.h:42
long64 getPosition(const RunEvent &re)
Return the position of the specified Event record or Run record respectively (if EventNum == -1 )...
Definition: RunEventMap.h:59
static const string testname
int main(int argc, char **argv)
Simple program that opens existing LCIO files and appends the records needed for direct access - if t...
int getNumberOfEventRecords() const
Definition: RunEventMap.h:77
void add(const RunEvent &re, long64 pos)
Add a new entry to the event map - if the RunEvent already exists the new position will be stored...
Definition: RunEventMap.cc:32
T count(T...args)
T insert(T...args)
void setRunNumber(int rn)
Sets the run number.
T size(T...args)
std::vector< int > IntVec
Vector of ints.
Definition: LCIOSTLTypes.h:22
T begin(T...args)
static const int directAccess
Configuration flags for the LCReader instance - to be used with LCFactory::createLCReader().
Definition: LCReader.h:41
T back_inserter(T...args)
LCReader * lcReader
Definition: lsh.cc:78
void LOG(const std::string &msg)
Definition: tutil.h:21