Namespaces | |
namespace | __init__ |
Functions | |
MixInputSvc (const string &name, ISvcLocator *svc) | |
~MixInputSvc () | |
StatusCode | initialize () |
StatusCode | doInit () |
StatusCode | queryInterface (const InterfaceID &riid, void **ppint) |
StatusCode | prepareStream () |
StatusCode | getSimHeader (GenHeader *&gh, SimHeader *&sh) |
double | flatdis (double maximum) |
double | nextTime (double tau) |
MixInputSvc::MixInputSvc | ( | const string & | name, | |
ISvcLocator * | svc | |||
) |
Definition at line 26 of file MixInputSvc.cc.
00027 :RootIOCnvSvc(name, svc),/* m_ranSvc(0),*/ 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 }
MixInputSvc::~MixInputSvc | ( | ) |
Definition at line 39 of file MixInputSvc.cc.
00040 { 00041 m_log<< MSG::DEBUG<< "~MixInputSvc()"<< endreq; 00042 }
StatusCode MixInputSvc::initialize | ( | ) |
Definition at line 44 of file MixInputSvc.cc.
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 /*sc = service("RndmGenSvc", m_ranSvc, true); 00055 if(sc.isFailure()) 00056 { 00057 m_log<< MSG::ERROR<< "Unable get RndmGenSvc service"<< m_ranSvc<< endreq; 00058 return sc; 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 }
StatusCode MixInputSvc::doInit | ( | ) |
Definition at line 70 of file MixInputSvc.cc.
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 }
StatusCode MixInputSvc::queryInterface | ( | const InterfaceID & | riid, | |
void ** | ppint | |||
) |
Definition at line 105 of file MixInputSvc.cc.
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 }
StatusCode MixInputSvc::prepareStream | ( | ) |
Definition at line 121 of file MixInputSvc.cc.
00122 { 00123 m_log<< MSG::INFO<< "PrepareStream............"<< endreq; 00124 //Need to prepare or not 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 //Initialize the files of each sample 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 //Initialize the file numbers of each sample 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 //Initialize the file index, file entry and stream entry for each sample 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 //m_fileindex[it->first] = flatdis((double)ris->getFiles().size()); 00168 m_fileindex[it->first] = flatdis((double)m_fileNum[it->first]); 00169 m_sfileentries[it->first] = flatdis((double)m_fileEntryNum[it->first]); 00170 /*bool ifjump = ris->getFiles().jump(m_fileindex[it->first]); 00171 if(ifjump == false) 00172 { 00173 m_log<< MSG::ERROR<< "Can't jump to the specified file!"<< endreq; 00174 return StatusCode::FAILURE; 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 //Initialize the maintau, the time nod by the samples 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 //if (m_uniSample.initialize(m_ranSvc, Rndm::Flat(0.0, m_maximum)).isFailure()) 00205 //{ 00206 // m_log<< MSG::FATAL<< "Failed to initialize uniform random numbers" << endreq; 00207 // return StatusCode::FAILURE; 00208 //} 00209 //if (m_exp.initialize(m_ranSvc, Rndm::Exponential(m_maintau)).isFailure()) 00210 //{ 00211 // m_log<< MSG::FATAL<< "Failed to initialize Gaussian random numbers" << endreq; 00212 // return StatusCode::FAILURE; 00213 //} 00214 return StatusCode::SUCCESS; 00215 }
StatusCode MixInputSvc::getSimHeader | ( | GenHeader *& | gh, | |
SimHeader *& | sh | |||
) |
Definition at line 217 of file MixInputSvc.cc.
00218 { 00219 m_log<< MSG::INFO<< "Now get one SimHeader(GenHeader) from the samples!"<< endreq; 00220 00221 //Initialize Service 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 //Initialize RootIOSvc 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 //Initialize ConversionSvc 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 //double randomnum = m_uniSample(); 00249 map<string, RootInputStream*>::iterator it; 00250 00251 //Loop on the samples 00252 for(it = m_simMap.begin(); it != m_simMap.end(); ) 00253 { 00254 //using randomnum to decide the input sample 00255 if(randomnum < m_nod[it->first]) 00256 { 00257 //SetEntry to find that if reaching the end of a file 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 /*bool ifjump = ris->getFiles().jump(m_fileindex[it->first]); 00269 if(ifjump == false) 00270 { 00271 m_log<< MSG::ERROR<< "Can't jump to specified file!"<< endreq; 00272 return StatusCode::FAILURE; 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 //SetEntry 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 //bool ifend = ris->setEntry(m_streamentries[it->first] ,true); 00293 //if(ifend == false) return StatusCode::FAILURE; 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 //Read in one PerSimHeader 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 //Important parameters 00311 TimeStamp newtime(nextTime(m_maintau)); 00312 //TimeStamp newtime(m_exp()); 00313 TimeStamp pretime = m_lastTime; 00314 00315 //Do a simple test of PerSimHeader 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) //There is an empty event 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 //Change the TimeStamp of PerSimHeader(TimeStamp in Context, earliest, latest) 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 //Get the PerSimHeader's PerGenHeaders 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 //Convert PerGenHeader to GenHeader 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 //Convert PerSimHeader to SimHeader 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 //Need to do a test of SimHeader(GenHeader) 00414 //Check the TimeStamps in SimHeader 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 //Check the SimHits in SimHeader 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 /*double earliesttime = 0.0; 00431 double latesttime = 0.0; 00432 for(vector<SimHit*>::iterator vit = vsh.begin(); vit != vsh.end(); vit++) 00433 { 00434 if(vit == vsh.begin() || earliesttime > (*vit)->hitTime()) 00435 { 00436 earliesttime = (*vit)->hitTime(); 00437 } 00438 if(vit == vsh.begin() || latesttime < (*vit)->hitTime()) 00439 { 00440 latesttime = (*vit)->hitTime(); 00441 } 00442 //m_log<< MSG::INFO<< "SimHit's time: "<< (*vit)->hitTime()<< endreq; 00443 } 00444 00445 TimeStamp detale(earliesttime/1.0e9); 00446 detale.Add(sh->timeStamp()); 00447 TimeStamp detall(latesttime/1.0e9); 00448 detall.Add(sh->timeStamp()); 00449 00450 cout<< "Timeinterval between earliest: "<< (detale.GetSec() - sh->earliest().GetSec()) 00451 << (detale.GetNanoSec() - sh->earliest().GetNanoSec())<< endl; 00452 cout<< "Timeinterval between latest: "<< (detall.GetSec() - sh->latest().GetSec()) 00453 << (detall.GetNanoSec() - sh->latest().GetNanoSec())<< endl;*/ 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 }
double MixInputSvc::flatdis | ( | double | maximum | ) |
Definition at line 467 of file MixInputSvc.cc.
00468 { 00469 //Rndm::Numbers flat(m_ranSvc, Rndm::Flat(0.0, maximum)); 00470 //if(flat) return flat(); 00471 //else 00472 //{ 00473 //m_log<< MSG::ERROR<< "Random Engine was not correct."<< endreq; 00474 //return 0.0; 00475 //} 00476 double tempnum = m_randomNum.Uniform(0.0, maximum); 00477 return tempnum; 00478 }
double MixInputSvc::nextTime | ( | double | tau | ) |
Definition at line 480 of file MixInputSvc.cc.
00481 { 00482 //Rndm::Numbers exponential(m_ranSvc, Rndm::Exponential(tau)); 00483 //if(exponential) return exponential(); 00484 //else 00485 //{ 00486 //m_log<< MSG::ERROR<< "Random Engine was not correct."<< endreq; 00487 //return 0.0; 00488 //} 00489 double tempnum = m_randomNum.Exp(tau); 00490 return tempnum; 00491 }