| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

MixInputSvc Namespace Reference


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)

Function Documentation

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 }

| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:44:38 2011 for MixInputSvc by doxygen 1.4.7