67 unsigned int numEvents()
const;
87 virtual vector<string>
arguments()
const {
return m_args; }
93 virtual bool isDefault()
const {
return ( m_isDefault ==
true ); }
99 vector<string> m_args;
103 void defineMPIType();
104 void distributeData();
110 MPI_Datatype MPI_KinStruct;
116 vector<Kinematics*> m_ptrCache;
117 vector<Kinematics*>::iterator m_ptrItr;
119 unsigned int m_numEvents;
128 m_ptrItr( m_ptrCache.begin() ),
133 MPI_Comm_rank( MPI_COMM_WORLD, &m_rank );
134 MPI_Comm_size( MPI_COMM_WORLD, &m_numProc );
136 m_isMaster = ( m_rank == 0 );
140 if( m_isMaster ) distributeData();
149 if( !m_isMaster && !m_isDefault ){
151 for( vector<Kinematics*>::iterator ptrItr = m_ptrCache.begin();
152 ptrItr != m_ptrCache.end();
166 if( m_isMaster )
return T::getEvent();
168 if( m_ptrItr != m_ptrCache.end() ){
206 m_ptrItr = m_ptrCache.begin();
214 assert( m_numProc > 1 );
218 int totalEvents = T::numEvents();
219 int stepSize = totalEvents / ( m_numProc - 1 );
220 int remainder = totalEvents % ( m_numProc - 1 );
224 for(
int i = 1; i < m_numProc; ++i ){
226 int nEvents = ( i > remainder ? stepSize : stepSize + 1 );
228 cout <<
"Sending process " << i <<
" " << nEvents <<
" events" << endl;
232 for(
int j = 0; j < nEvents; ++j ){
237 assert( event !=
NULL );
238 fillStruct( &(kinArray[j]), event );
250 MPI_COMM_WORLD, &status );
268 MPI_COMM_WORLD, &status );
276 MPI_COMM_WORLD, &status );
278 for(
int i = 0; i < nEvents; ++i ){
280 m_ptrCache.push_back( createKin( &(kinArray[i]) ) );
283 cout <<
"Process " << m_rank <<
" received " 284 << m_ptrCache.size() <<
" events." << endl;
289 m_numEvents =
static_cast< unsigned int >( m_ptrCache.size() );
302 return T::numEvents();
314 const vector<TLorentzVector>& partList = kin->
particleList();
315 kinStruct->
nPart = partList.size();
320 for( vector<TLorentzVector>::const_iterator vec = partList.begin();
321 vec != partList.end(); ++vec ){
323 int i = ( vec - partList.begin() );
325 kinStruct->
e[i] = (*vec).E();
326 kinStruct->
px[i] = (*vec).Px();
327 kinStruct->
py[i] = (*vec).Py();
328 kinStruct->
pz[i] = (*vec).Pz();
336 vector<TLorentzVector> partList;
338 for(
int i = 0; i < kinStruct->
nPart; ++i ){
340 partList.push_back( TLorentzVector( kinStruct->
px[i],
358 MPI_Datatype type[6];
360 MPI_Aint baseAddress;
361 MPI_Address( &kinStruct, &baseAddress );
364 MPI_Address( &kinStruct.
nPart, &loc[0] );
365 loc[0] -= baseAddress;
369 MPI_Address( &kinStruct.
weight, &loc[1] );
370 loc[1] -= baseAddress;
374 MPI_Address( &kinStruct.
e, &loc[2] );
375 loc[2] -= baseAddress;
379 MPI_Address( &kinStruct.
px, &loc[3] );
380 loc[3] -= baseAddress;
384 MPI_Address( &kinStruct.
py, &loc[4] );
385 loc[4] -= baseAddress;
389 MPI_Address( &kinStruct.
pz, &loc[5] );
390 loc[5] -= baseAddress;
393 MPI_Type_struct( 6, length, loc, type, &MPI_KinStruct );
394 MPI_Type_commit( &MPI_KinStruct );
virtual bool isDefault() const
unsigned int numEvents() const
float px[Kinematics::kMaxParticles]
float e[Kinematics::kMaxParticles]
float py[Kinematics::kMaxParticles]
virtual DataReader * clone() const
const vector< TLorentzVector > & particleList() const
float pz[Kinematics::kMaxParticles]
virtual DataReader * newDataReader(const vector< string > &args) const
virtual vector< string > arguments() const