00001 #include "MixInputSvc/MixInputSvc.h"
00002
00003 #include "Event/GenHeader.h"
00004 #include "Event/SimHeader.h"
00005 #include "Event/RegistrationSequence.h"
00006
00007 #include "RootIOSvc/IRootIOSvc.h"
00008 #include "RootIOSvc/RootIOBaseCnv.h"
00009 #include "RootIOSvc/RootIOAddress.h"
00010 #include "RootIOSvc/RootIOTypedCnv.h"
00011
00012 #include "PerBaseEvent/PerRef.h"
00013 #include "PerSimEvent/PerSimHit.h"
00014 #include "PerGenEvent/PerGenHeader.h"
00015 #include "PerSimEvent/PerSimHeader.h"
00016 #include "PerSimEvent/PerSimHitHeader.h"
00017 #include "PerSimEvent/PerSimHitCollection.h"
00018
00019 #include "GaudiKernel/IService.h"
00020 #include "GaudiKernel/IRndmGen.h"
00021 #include "GaudiKernel/IRndmEngine.h"
00022 #include "GaudiKernel/IRndmGenSvc.h"
00023 #include "GaudiKernel/IConversionSvc.h"
00024 #include "GaudiKernel/IDataManagerSvc.h"
00025
00026 MixInputSvc::MixInputSvc(const string& name, ISvcLocator* svc)
00027 :RootIOCnvSvc(name, svc), m_log(msgSvc(), "MixInputSvc")
00028 {
00029 m_isvc = 0;
00030 m_rioSvc = 0;
00031 m_convSvc = 0;
00032
00033 declareProperty("SampleInputs" , m_inputSamples , "Map of sample input files");
00034 declareProperty("SampleTaus" , m_timeTau , "Map of sample Tau");
00035 declareProperty("SampleFileNum", m_fileEntryNum , "Map of sample input files' numbers");
00036 declareProperty("BeginTime" , m_lasttime = 0.0, "Begin time");
00037 }
00038
00039 MixInputSvc::~MixInputSvc()
00040 {
00041 m_log<< MSG::DEBUG<< "~MixInputSvc()"<< endreq;
00042 }
00043
00044 StatusCode MixInputSvc::initialize()
00045 {
00046 m_log<< MSG::DEBUG<< "initializing @"<< (void*)this<< endreq;
00047 StatusCode sc = RootIOCnvSvc::initialize();
00048 if(sc.isFailure())
00049 {
00050 m_log<< MSG::ERROR<< "Parent class(RootIOCnvSvc) failed to initialize!"<< endreq;
00051 return sc;
00052 }
00053
00054
00055
00056
00057
00058
00059
00060
00061 sc = doInit();
00062 if(sc.isFailure())
00063 {
00064 m_log<< MSG::ERROR<< "Something wrong before mixing."<<endreq;
00065 return sc;
00066 }
00067 return sc;
00068 }
00069
00070 StatusCode MixInputSvc::doInit()
00071 {
00072 m_log<< MSG::DEBUG<< "Reset some variables at begining."<< endreq;
00073 if(m_inputSamples.size() != m_timeTau.size() || m_timeTau.size() == 0)
00074 {
00075 m_log<< MSG::ERROR<< "Please check the input samples' files "
00076 << "and the input samples' taus!"<< endreq;
00077 return StatusCode::FAILURE;
00078 }
00079 else
00080 {
00081 map<string, double>::iterator itt, tend = m_timeTau.end();
00082 map<string, vector<string> >::iterator iter;
00083 for(itt = m_timeTau.begin(); itt != tend; itt++)
00084 {
00085 iter = m_inputSamples.find(itt->first);
00086 if(iter == m_inputSamples.end())
00087 {
00088 m_log<< MSG::ERROR<< "Configuration is not correct for mixing"<< endreq;
00089 return StatusCode::FAILURE;
00090 }
00091 m_fileNum[itt->first] = 0;
00092 m_fileindex[itt->first] = 0;
00093 m_gfileentries[itt->first] = 0;
00094 m_sfileentries[itt->first] = 0;
00095 m_streamentries[itt->first] = 0;
00096 }
00097 m_maintau = 0.0;
00098 m_maximum = 0.0;
00099 TimeStamp lastTime(m_lasttime);
00100 m_lastTime = lastTime;
00101 }
00102 return StatusCode::SUCCESS;
00103 }
00104
00105 StatusCode MixInputSvc::queryInterface(const InterfaceID& riid, void** ppint)
00106 {
00107 if(IID_IMixInputSvc.versionMatch(riid))
00108 {
00109 m_log<< MSG::DEBUG<< "queryInterface("<< riid
00110 << ")-->(IMixInputSvc*)"<< (void*)this<< endreq;
00111 *ppint = (IMixInputSvc*)this;
00112 }
00113 else
00114 {
00115 return RootIOCnvSvc::queryInterface(riid, ppint);
00116 }
00117 addRef();
00118 return StatusCode::SUCCESS;
00119 }
00120
00121 StatusCode MixInputSvc::prepareStream()
00122 {
00123 m_log<< MSG::INFO<< "PrepareStream............"<< endreq;
00124
00125 if(0 == m_sampleInputStreamMap.size())
00126 {
00127 m_log<< MSG::DEBUG<< "Need to prepare streams from mixing sources."<< endreq;
00128 map<string, vector<string> >::iterator miter, mbegin, mend;
00129 mbegin = m_inputSamples.begin();
00130 mend = m_inputSamples.end();
00131 m_log<< MSG::INFO<< "Initialize the mixing samples here."<< endreq;
00132
00133
00134 for(miter = mbegin; miter != mend; miter++)
00135 {
00136 m_inputStreamMap.clear();
00137
00138 vector<string> files = miter->second;
00139 setInputFiles(files);
00140 doInitialize();
00141
00142 m_sampleInputStreamMap[miter->first] = inputStreams();
00143 m_simMap[miter->first] = m_inputStreamMap[DayaBay::SimHeaderLocation::Default];
00144 m_genMap[miter->first] = m_inputStreamMap[DayaBay::GenHeaderLocation::Default];
00145 }
00146
00147
00148 for(miter = mbegin; miter != mend; miter++)
00149 {
00150 int filenum = 0;
00151 vector<string> files = miter->second;
00152 for(vector<string>::iterator vit = files.begin(); vit != files.end(); vit++)
00153 {
00154 filenum++;
00155 }
00156 m_fileNum[miter->first] = filenum;
00157 }
00158 m_log<< MSG::INFO<< "Initialize the mixing samples successfully."<< endreq;
00159
00160
00161 m_log<< MSG::INFO<< "Initialize the mixing samples' file index, "
00162 << "file entry and stream entry here."<< endreq;
00163
00164 for(map<string, RootInputStream*>::iterator it = m_simMap.begin(); it != m_simMap.end(); it++)
00165 {
00166 RootInputStream* ris = it->second;
00167
00168 m_fileindex[it->first] = flatdis((double)m_fileNum[it->first]);
00169 m_sfileentries[it->first] = flatdis((double)m_fileEntryNum[it->first]);
00170
00171
00172
00173
00174
00175
00176 m_log<< MSG::INFO<< "Now needing to jump to "<< it->first<< ": "
00177 << m_inputSamples[it->first][m_fileindex[it->first]]<< " file"<< endreq;
00178 m_log<< MSG::INFO<< "Now the file entry is: "<< m_sfileentries[it->first]<< endreq;
00179
00180 ris->setFileEntry(m_fileindex[it->first], m_sfileentries[it->first], false);
00181 m_streamentries[it->first] = ris->getEntry();
00182 }
00183
00184 m_log<< MSG::INFO<< "SteamMap Size = "<< m_sampleInputStreamMap.size()
00185 << "/"<< m_simMap.size()<< endreq;
00186
00187
00188 m_log<< MSG::INFO<< "Initialize the mixing samples' maintau, time nods here."<< endreq;
00189 for(map<string, RootInputStream*>::iterator mit = m_simMap.begin(); mit != m_simMap.end(); mit++)
00190 {
00191 m_maintau += 1/m_timeTau[mit->first];
00192 m_nod[mit->first] = m_maintau;
00193 m_log<< MSG::INFO<< "m_nod["<< mit->first<< "] is: "<< m_nod[mit->first]<< endreq;
00194 m_maximum = m_maintau;
00195 }
00196 m_maintau = 1/m_maintau;
00197 m_log<< MSG::INFO<< "The main tau is: "<< m_maintau<< endreq;
00198 }
00199 else
00200 {
00201 m_log<< MSG::INFO<< "Streams prepared! Nothing to do!"<< endreq;
00202 }
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 return StatusCode::SUCCESS;
00215 }
00216
00217 StatusCode MixInputSvc::getSimHeader(GenHeader*& gh, SimHeader*& sh)
00218 {
00219 m_log<< MSG::INFO<< "Now get one SimHeader(GenHeader) from the samples!"<< endreq;
00220
00221
00222 StatusCode sc = this->service("RootIOCnvSvc", m_isvc, true);
00223 if(sc.isFailure())
00224 {
00225 m_log<< MSG::ERROR<< "Failed to get RootIOCnvSvc as IService"<< endreq;
00226 return sc;
00227 }
00228
00229
00230 sc = m_isvc->queryInterface(IRootIOSvc::interfaceID(), (void**)&m_rioSvc);
00231 if(sc.isFailure())
00232 {
00233 m_log<< MSG::ERROR<< "Conversion service RootIOCnvSvc"
00234 << " does not implement IRootIOCnvSvc"<< endreq;
00235 return sc;
00236 }
00237
00238
00239 sc = m_isvc->queryInterface(IConversionSvc::interfaceID(), (void**)&m_convSvc);
00240 if(sc.isFailure())
00241 {
00242 m_log<< MSG::ERROR<< "Conversion service RootIOCnvSvc"
00243 << " does not implement IConversionSvc"<< endreq;
00244 return sc;
00245 }
00246
00247 double randomnum = flatdis(m_maximum);
00248
00249 map<string, RootInputStream*>::iterator it;
00250
00251
00252 for(it = m_simMap.begin(); it != m_simMap.end(); )
00253 {
00254
00255 if(randomnum < m_nod[it->first])
00256 {
00257
00258 RootInputStream* ris = it->second;
00259 RootInputFile* rif = ris->getFiles().current();
00260
00261 RootInputStream* gris = m_genMap[it->first];
00262 RootInputFile* grif = gris->getFiles().current();
00263
00264 if(m_sfileentries[it->first] >= rif->entries())
00265 {
00266 m_sfileentries[it->first] = flatdis((double)m_fileEntryNum[it->first]);
00267 m_fileindex[it->first] = flatdis((double)m_fileNum[it->first]);
00268
00269
00270
00271
00272
00273
00274 m_log<< MSG::INFO<< "Now needing to jump to "<< it->first<< ": "
00275 << m_inputSamples[it->first][m_fileindex[it->first]]<< " file."<< endreq;
00276 m_log<< MSG::INFO<< "Now the file entry is: "<< m_sfileentries[it->first]<< endreq;
00277
00278 ris->setFileEntry(m_fileindex[it->first], m_sfileentries[it->first], true);
00279 m_streamentries[it->first] = ris->getEntry();
00280 rif = ris->getFiles().current();
00281 }
00282 else
00283 {
00284
00285 m_log << MSG::INFO<< "SetEntry manually: "<< " The sample: "<< it->first
00286 << " File entry: " << m_sfileentries[it->first]
00287 << " Stream entry: " << m_streamentries[it->first]
00288 << " RootInputStream: "<< ris
00289 << " Old entry: " << ris->getEntry()<< endreq;
00290 ris->setFileEntry(m_fileindex[it->first], m_sfileentries[it->first], true);
00291 rif = ris->getFiles().current();
00292
00293
00294 }
00295
00296 m_log<< MSG::INFO<< "Now the file is: " << rif->filename() << endreq;
00297 m_log<< MSG::INFO<< "Now the file index is: "<< m_fileindex[it->first] << endreq;
00298 m_log<< MSG::INFO<< "Now the file entry is: "<< m_sfileentries[it->first]<< endreq;
00299
00300
00301 m_log<< MSG::INFO<< "Casting TObject to PerSimHeader."<< endreq;
00302 PerSimHeader* psh = (PerSimHeader*)((void*)(ris->obj()));
00303 m_log<< MSG::INFO<< "======= PerSimHeader: "<< psh<< endreq;
00304 if(!psh)
00305 {
00306 m_log<< MSG::ERROR<< "Failed to retrive pointer to PerSimHeader : Terminated!"<< endreq;
00307 return StatusCode::FAILURE;
00308 }
00309
00310
00311 TimeStamp newtime(nextTime(m_maintau));
00312
00313 TimeStamp pretime = m_lastTime;
00314
00315
00316 vector<PerSimHit*>::size_type vpsh = 0;
00317 PerSimHitHeader* pshh = psh->hits;
00318 map<short int, PerSimHitCollection*> pshc = pshh->hitCollections;
00319 for(map<short int, PerSimHitCollection*>::iterator mpit = pshc.begin(); mpit != pshc.end(); mpit++)
00320 {
00321 vpsh += (mpit->second)->hits.size();
00322 m_log<< MSG::INFO<< "Detector : "<< mpit->first
00323 << "-- PerSimHit numbers : "<< (mpit->second)->hits.size()<< endreq;
00324 }
00325
00326 if(0 == vpsh)
00327 {
00328 m_log<< MSG::DEBUG<< "There is no SimHit in SimHeader!"<< endreq;
00329 m_sfileentries[it->first]++;
00330 m_streamentries[it->first]++;
00331 m_log<< MSG::DEBUG<< "Set new file entry as: "<< m_sfileentries[it->first]<< endreq;
00332 continue;
00333 }
00334 else
00335 {
00336 m_log<< MSG::INFO<< "PerSimHeader from "<< it->first<< " with "<< vpsh<< " PerSimHits!"<< endreq;
00337 m_log<< MSG::INFO<< "Generate new time["<< newtime.GetSeconds()
00338 << "sec] for sample ["<< it->first<< "]"<< endreq;
00339
00340
00341 pretime.Add(newtime);
00342 TimeStamp temptime = psh->context.GetTimeStamp();
00343 psh->context.SetTimeStamp(pretime);
00344 TimeStamp eT = temptime - psh->earliest;
00345 psh->earliest = pretime - eT;
00346 TimeStamp Tl = temptime - psh->latest;
00347 psh->latest = pretime - Tl;
00348
00349
00350 vector<PerRef> iheaders = psh->inputHeaders;
00351 for(vector<PerRef>::iterator prit = iheaders.begin(); prit != iheaders.end(); prit++)
00352 {
00353 m_gfileentries[it->first] = (*prit).entry();
00354 gris->setFileEntry(m_fileindex[it->first], m_gfileentries[it->first], true);
00355 grif = gris->getFiles().current();
00356 m_log<< MSG::INFO<< "Casting TObject to PerGenHeader."<< endreq;
00357 PerGenHeader* pgh = (PerGenHeader*)((void*)(gris->obj()));
00358 m_log<< MSG::INFO<< "======= PerGenHeader: "<< pgh<< endreq;
00359 if(!pgh)
00360 {
00361 m_log<< MSG::ERROR<< "Failed to retrive pointer to PerGenHeader : Terminated!"<< endreq;
00362 return StatusCode::FAILURE;
00363 }
00364
00365
00366 IConverter* gcnv = m_convSvc->converter(gh->classID());
00367 if(!gcnv)
00368 {
00369 m_log<< MSG::ERROR<< "Failed to get GenHeader converter"<< endreq;
00370 return StatusCode::FAILURE;
00371 }
00372 RootIOTypedCnv<PerGenHeader, GenHeader>* ghCnv = 0;
00373 ghCnv = dynamic_cast< RootIOTypedCnv<PerGenHeader, GenHeader>* >(gcnv);
00374 if(!ghCnv)
00375 {
00376 m_log<< MSG::ERROR<< "Failed to cast GenHeader converter"<< endreq;
00377 return StatusCode::FAILURE;
00378 }
00379
00380 sc = ghCnv->PerToTran(*pgh, *gh);
00381 if(sc.isFailure())
00382 {
00383 m_log<< MSG::ERROR<< "Failed to translate PerGenHeader to GenHeader!"
00384 << endreq;
00385 return sc;
00386 }
00387 }
00388
00389 m_log<< MSG::INFO<< "GenHeaders: "<< gh<< endreq;
00390
00391
00392 IConverter* cnv = m_convSvc->converter(sh->classID());
00393 if(!cnv)
00394 {
00395 m_log<< MSG::ERROR<< "Failed to get SimHeader converter"<< endreq;
00396 return StatusCode::FAILURE;
00397 }
00398 RootIOTypedCnv<PerSimHeader, SimHeader>* shCnv = 0;
00399 shCnv = dynamic_cast< RootIOTypedCnv<PerSimHeader, SimHeader>* >(cnv);
00400 if(!shCnv)
00401 {
00402 m_log<< MSG::ERROR<< "Failed to cast SimHeader converter"<< endreq;
00403 return StatusCode::FAILURE;
00404 }
00405 sc = shCnv->PerToTran(*psh, *sh);
00406 if(sc.isFailure())
00407 {
00408 m_log<< MSG::ERROR<< "Failed to translate PerSimHeader to SimHeader!"
00409 << endreq;
00410 return sc;
00411 }
00412
00413
00414
00415 m_log<< MSG::INFO<< "SimHeader's TimeStamp: "<< sh->timeStamp().GetSec()<< "--"
00416 << sh->timeStamp().GetNanoSec()<< endreq;
00417 m_log<< MSG::INFO<< "SimHeader's Earliest: "<< sh->earliest().GetSec()<< "--"
00418 << sh->earliest().GetNanoSec()<< endreq;
00419 m_log<< MSG::INFO<< "SimHeader's Latest: "<< sh->latest().GetSec()<< "--"
00420 << sh->latest().GetNanoSec()<< endreq;
00421
00422
00423 const SimHitHeader* shh = sh->hits();
00424 m_log<< MSG::INFO<< "SimHitHeader's address: "<< shh<< endreq;
00425 map<short int, SimHitCollection*> shc = shh->hitCollection();
00426 for(map<short int, SimHitCollection*>::iterator mit = shc.begin(); mit != shc.end(); mit++)
00427 {
00428 vector<SimHit*> vsh = mit->second->collection();
00429 m_log<< MSG::INFO<< "In Det"<< mit->first<< " : SimHit's num = "<< vsh.size()<< endreq;
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 }
00455 m_sfileentries[it->first]++;
00456 m_streamentries[it->first]++;
00457 m_lastTime = pretime;
00458
00459 break;
00460 }
00461 }
00462 it++;
00463 }
00464 return StatusCode::SUCCESS;
00465 }
00466
00467 double MixInputSvc::flatdis(double maximum)
00468 {
00469
00470
00471
00472
00473
00474
00475
00476 double tempnum = m_randomNum.Uniform(0.0, maximum);
00477 return tempnum;
00478 }
00479
00480 double MixInputSvc::nextTime(double tau)
00481 {
00482
00483
00484
00485
00486
00487
00488
00489 double tempnum = m_randomNum.Exp(tau);
00490 return tempnum;
00491 }