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

In This Package:

TrigReadProc.cc

Go to the documentation of this file.
00001 #include "TrigReadProc.h"
00002 #include "TrigSim/ITsTriggerTool.h"
00003 
00004 #include "Event/SimTrigHeader.h"
00005 #include "Event/ElecHeader.h"
00006 #include "Event/ElecPulseHeader.h"
00007 #include "Event/ElecCrateHeader.h"
00008 #include "Event/ReadoutPmtCrate.h"
00009 #include "Event/ReadoutRpcCrate.h"
00010 #include "Event/GenHeader.h"
00011 #include "MuonProphet/MpMuonFate.h"
00012 
00013 #include <vector>
00014 
00015 TrigReadProc::TrigReadProc(const std::string& name, ISvcLocator* pSvcLocator)
00016     : StageProcessor<SimReadoutHeader>(name,pSvcLocator)
00017 {
00018     // trigger
00019     m_trigToolNames.push_back("TsMultTriggerTool");
00020     declareProperty("TrigTools",m_trigToolNames,
00021                     "Tools to generate Triggers");
00022     declareProperty("TriggerFilter",m_trigFilterName="TsSortTool",
00023                     "Tool to do final filtering / combining of triggers");
00024     
00025     // readout
00026     m_roToolNames.push_back("ROsFeeReadoutTool");
00027     m_roToolNames.push_back("ROsFecReadoutTool");
00028     declareProperty("RoTools",m_roToolNames,
00029                     "Tools to generate Triggers");
00030     declareProperty("TrigPackagerTool",m_roTrigPackName="ROsTriggerDataPackerTool",
00031                     "Tool to convert trigger commands from TrigSim to TriggerDataPackage");
00032     
00033     // Fast trigger and readout simulation
00034     declareProperty("FastTrigReadSimTool", m_fastToolName = "FastTrigReadSimTool" , "Fast trigger and readout simulation tool");
00035 
00036 }
00037 
00038 TrigReadProc::~TrigReadProc()
00039 {
00040 }
00041 
00042 StatusCode TrigReadProc::initialize()
00043 {
00044     StatusCode sc = StageProcessor<SimReadoutHeader>::initialize();
00045     if (sc.isFailure()) return sc;
00046 
00047     // trigger
00048     for (size_t ind=0; ind < m_trigToolNames.size(); ++ind) {
00049         std::string tgr = m_trigToolNames[ind];
00050         try {
00051             m_trigTools.push_back(tool<ITsTriggerTool>(tgr));
00052         }
00053         catch(const GaudiException& exg) {
00054             fatal() << "Failed to get Trigger Tool: \"" << tgr << "\"" << endreq;
00055             return StatusCode::FAILURE;
00056         }
00057         info () << "Added trigger tool " << tgr << endreq;
00058     }
00059     try {
00060         m_triggerSorter = tool<ITsTriggerTool>(m_trigFilterName);
00061     }
00062     catch(const GaudiException& exg){
00063         fatal() << "Failed to get TriggerFilterTool: \"" << m_trigFilterName 
00064                 << "\"" << endreq;
00065         return StatusCode::FAILURE;
00066     }
00067 
00068 
00069     // readout
00070     try{
00071         m_roTrigPackTool = tool<IROsTriggerDataPackerTool>(m_roTrigPackName);
00072     }catch(const GaudiException& exg){
00073         fatal() << "Failed to get Readout Trigger Package Tool: \"" 
00074                 << m_roTrigPackName << "\"" << endreq;
00075         return StatusCode::FAILURE;
00076     }
00077     
00078     for (size_t ind=0; ind < m_roToolNames.size(); ++ind) {
00079         std::string rotool = m_roToolNames[ind];
00080         try {
00081             m_roTools.push_back(tool<IROsReadoutTool>(rotool));
00082         }
00083         catch(const GaudiException& exg) {
00084             fatal() << "Failed to get Readout Tool: \"" << rotool << "\"" << endreq;
00085             return StatusCode::FAILURE;
00086         }
00087         info () << "Added readout tool " << rotool << endreq;
00088     }
00089 
00090     // Fast trigger and readout simulation tool
00091     m_fastTool = tool<IFastTrigReadSimTool>(m_fastToolName);
00092     info() << "Added fast simulation tool: " << m_fastToolName << endreq;
00093 
00095     m_currentTime=0;
00096     m_SimRODataList.clear();
00097 
00098 
00099     return StatusCode::SUCCESS;
00100 }
00101 
00102 StatusCode TrigReadProc::execute()
00103 {
00104     debug()<<"executing... "<<endreq;
00105     // Only do anything if the current stage time has advanced beyond
00106     // the last time we ran.
00107     static bool first_time = true;
00108     if (!first_time && m_currentTime > thisStage()->currentTime()) {
00109         return StatusCode::SUCCESS;
00110     }
00111     
00114     FFTimeStamp tm(0,0);
00115     FFTimeStamp dt(0,0); 
00116     FFTimeStamp localtime(0,0);
00117 
00118     SimReadoutData::DataList::iterator SimROit;
00119 
00120     if(first_time) {
00121         // nothing to do here
00122     } else {
00123         SimROit=m_SimRODataList.begin();
00124         localtime=SimROit->first;
00125     }
00126 
00128     //debug()<<"A: local time= "<<localtime<<endreq;
00129     //debug()<<"A: lower stage time= "<<m_lowerStage->currentTime()<<endreq;
00130     while(first_time||localtime>=lowerStage()->currentTime()) {
00131         first_time=false;
00133         //debug() << "In while loop, pulling data from lower Stage ......" << endreq;
00134 
00135         IStageData* pIStageData=0;
00136         StatusCode sc = lowerStage()->nextElement(pIStageData);  // pulling out
00137         if (sc.isFailure()) {
00138             error() << "Failed to pull ElecHeader" << endreq;
00139             return sc;
00140         }
00141 
00142         ElecData* pElecData=0;
00143         try{
00144             pElecData = dynamic_cast<ElecData*>(pIStageData);
00145         }
00146         catch(...) {
00147             error() << "Failed to get GnrtrData pointer" <<endreq;
00148         }
00149 
00150         //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
00157         // delete the used one                                                                                                            
00158         tm=pElecData->time();
00159         //debug() << "data pulled out from lower stage has time: "<<tm<<endreq;
00160 
00162         preExecute();
00163         SimReadoutData*   pSimROData=0;   
00164         
00166         // Do trigger readout simulation
00167         // get eheader
00168         ElecHeader* ehead = &(pElecData->header());
00169         debug()<<"ehead at "<<ehead<<endreq;
00170 
00172         bool G4Noble = false;
00173         const DayaBay::ElecPulseHeader* pPulse = ehead -> pulseHeader();
00174         const DayaBay::ElecCrateHeader* pCrate = ehead -> crateHeader();
00176         if( pPulse == 0 && pCrate == 0 ) {
00178             debug()<<"input header size " << ehead->inputHeaders().size()<<endreq;
00179             const DayaBay::IHeader* iSheader = (ehead  -> inputHeaders()) [0];
00180             const DayaBay::IHeader* iGheader = (iSheader->inputHeaders()) [0];
00181             const DayaBay::GenHeader* genHeader = dynamic_cast<const DayaBay::GenHeader*>(iGheader);
00182             const HepMC::GenEvent* genEvent = genHeader->event();
00183 
00184             if( genEvent )  {
00185                 HepMC::GenEvent::particle_const_iterator pci, pci_end = genEvent->particles_end();
00186 
00187                 for( pci = genEvent->particles_begin(); pci != pci_end; ++pci )  {
00188                     if( (*pci)->pdg_id() == 13 || (*pci)->pdg_id() == -13 )  {   // muon
00189                         if( (*pci)->status() != MpMuonFate::kNeedSim )   {   //  geant4-noble particle
00190                             G4Noble = true;
00191                         }
00192                     }
00193                 }
00194             }
00195         }
00196 
00197         // define output header
00198         SimReadoutHeader* srhead=MakeHeaderObject();
00199         debug()<<"exec num "<<srhead->execNumber()<<endreq;
00200 
00201         if(G4Noble) {
00202             // do fast trigger and readout simulation
00203             sc = this->fastTrigReadSim( ehead, srhead );
00204             if (sc.isFailure()) return sc;
00205             debug()<<"exec num "<<srhead->execNumber()<<endreq;
00206         } else {
00207             // do trigger and readout simulation
00208             sc = this->TR_execute( ehead, srhead );
00209             if (sc.isFailure()) return sc;
00210             debug()<<"exec num "<<srhead->execNumber()<<endreq;
00211         }
00212 
00213         // define SimReadoutData
00214         pSimROData=new SimReadoutData(*srhead);
00215         debug()<<"exec num "<<srhead->execNumber()<<endreq;
00217 
00218         this->AppendInputHeader( ehead );
00219 
00220         postExecute();
00221 
00222         // It will not be used again
00223         delete pElecData; pElecData = 0;
00224 
00225         //debug() << "new data generated at time: "<< pSimData->time()<< endreq;
00226         //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
00227 
00228         // push back into a local store
00229         m_SimRODataList.insert(SimReadoutData::DataList::value_type(pSimROData->time(),pSimROData));
00230 
00232         SimROit=m_SimRODataList.begin();
00233         localtime=SimROit->first;
00234         //debug()<<"B: local time= "<<localtime<<endreq;
00235         //debug()<<"B: lower stage time= "<<m_lowerStage->currentTime()<<endreq;
00236     }
00237 
00238     m_currentTime=localtime;
00239     //debug() << "m_CurrentTime= "<< m_CurrentTime << endreq;
00240 
00243 
00244     SimROit=m_SimRODataList.begin();
00245     debug() << "to grep: new data pushed out at time " << SimROit->first << endreq;
00246     debug() << "New SimReadoutHeader at "<<&(SimROit->second->header())<<endreq;
00247     debug() << "It has "<<SimROit->second->header().readouts().size()<<" readouts"<<endreq;
00248     debug() << "TimeStamp "<<SimROit->second->header().timeStamp()<<endreq;
00249     debug() << "Earliest  "<<SimROit->second->header().earliest()<<endreq;
00250     debug() << "Latest    "<<SimROit->second->header().latest()<<endreq;
00251 
00252     thisStage()->pushElement(SimROit->second);
00253     this->registerData(*(SimROit->second));
00254     m_SimRODataList.erase(SimROit);
00255 
00256 
00257     return StatusCode::SUCCESS;
00258 }
00259 
00260 StatusCode TrigReadProc::finalize()
00261 {
00262     // trigger
00263     for (size_t ind=0; ind < m_trigTools.size(); ++ind) {
00264         m_trigTools[ind]->release();
00265     }
00266     m_trigTools.clear();
00267     m_triggerSorter->release();
00268     
00269     // readout
00270     for (size_t ind=0; ind < m_roTools.size(); ++ind) {
00271         m_roTools[ind]->release();
00272     }
00273     m_roTools.clear();
00274 
00275     return this->StageProcessor<SimReadoutHeader>::finalize();
00276 }
00277 
00278 StatusCode TrigReadProc::runTrigSim(const ElecHeader& ehead,
00279                                    SimTrigHeader*& thead)
00280 {
00281     thead->setCommandHeader(new SimTrigCommandHeader(thead));
00282         
00283     //set triggers to have same validity range as the crate it belongs to.
00284     thead->setContext(ehead.context());
00285     thead->setTimeStamp(ehead.timeStamp());
00286     thead->setEarliest(ehead.earliest());
00287     thead->setLatest(ehead.latest());
00288     debug()<<"runTrigSim "<<thead->earliest()<<endreq;
00289     
00290     // Let each tool do its thing on the event
00291     for (size_t ind = 0; ind< m_trigTools.size(); ++ind) {
00292         debug () << "Running trigger tool #" << ind << " " << m_trigToolNames[ind] << endreq;
00293 
00294         StatusCode sc = m_trigTools[ind]->mutate(thead,ehead);
00295         if (sc.isFailure()) {
00296             fatal() << "Trigger Tool " << m_trigToolNames[ind] 
00297                     << " failed" << endreq;
00298             delete thead; thead = 0;
00299             return StatusCode::FAILURE;
00300         }
00301     }
00302     if ( m_triggerSorter->mutate(thead,ehead).isFailure()){
00303         fatal() << "Trigger Tool " << m_triggerSorter
00304                 << " failed" << endreq;
00305         return StatusCode::FAILURE;
00306     }
00307     
00308     return StatusCode::SUCCESS;
00309 }
00310 
00311 StatusCode TrigReadProc::runReadoutSim(const ElecHeader& ehead,
00312                                       const SimTrigHeader& thead,
00313                                       SimReadoutHeader*& srhead)
00314 {
00315     //    srhead = new SimReadoutHeader;
00316     srhead->setContext(ehead.context());
00317     srhead->setTimeStamp(ehead.timeStamp());
00318     srhead->setEarliest(ehead.earliest());
00319     srhead->setLatest(ehead.latest());
00320     debug()<<"runReadoutSim "<<srhead->earliest()<<endreq;
00321     
00322     // fill roHeader With TriggerDataPackage
00323     //  With this way of doing it the individual readout tools theoretically
00324     //  no longer need to know about the trigger header.
00325     debug() <<"Creating Trigger Data Packages" << endreq;
00327     std::vector<DayaBay::ReadoutTriggerDataPkg*> trigPkgs;
00329     m_roTrigPackTool->fillDataPakages(trigPkgs,thead);
00330     
00331     // Let each tool do its thing on the event
00332     for (size_t ind = 0; ind< m_roTools.size(); ++ind) {
00333 
00334         debug () << "Running readout tool #" << ind << " " << m_roToolNames[ind] << endreq;
00335 
00336         debug()<<"before mutate: exec num "<<srhead->execNumber()<<endreq;
00337         StatusCode sc = m_roTools[ind]->mutate(srhead,trigPkgs,ehead);
00338         if (sc.isFailure()) {
00339             fatal() << "Readout Tool " << m_roToolNames[ind] 
00340                     << " failed" << endreq;
00341             delete srhead; srhead = 0;
00342             return StatusCode::FAILURE;
00343         }
00344     }
00345 
00346     return StatusCode::SUCCESS;
00347 }
00348 
00349 StatusCode TrigReadProc::TR_execute(const ElecHeader* ehead,SimReadoutHeader*& srhead)
00350 {
00351     StatusCode sc;
00352     debug() << "Runing Trigger and Readout Simulation" << endreq;
00353 
00354     {
00355         const ElecPulseHeader::PulseCollectionMap& pcmap = ehead->pulseHeader()->pulseCollection();
00356         debug() << "TR_execute() got " << pcmap.size() << " pulse collections:\n";
00357         ElecPulseHeader::PulseCollectionMap::const_iterator it, done=pcmap.end();
00358         for (it=pcmap.begin(); it != done; ++it) {
00359             debug() << "\tdetector: " << it->first << " has " << it->second->pulses().size() << "\n";
00360         }
00361         debug() << endreq;
00362     }
00363 
00364 
00365     SimTrigHeader* thead = new SimTrigHeader;
00366     sc = this->runTrigSim(*ehead,thead);
00367     if (sc.isFailure() || !thead) {
00368         error() << "fillReadouts(): Failed to run TrigRead" << endreq;
00369         return StatusCode::FAILURE;
00370     }
00371     put(thead,thead->defaultLocation());
00372     // set input headers
00373     std::vector<const DayaBay::IHeader*> iElecHeaders;
00374     iElecHeaders.push_back(ehead);
00375     thead->setInputHeaders(iElecHeaders);
00376     // set execution number
00377     thead->setExecNumber(srhead->execNumber());
00378 
00379 
00380     debug()<<"exec num "<<srhead->execNumber()<<endreq;
00381     sc = this->runReadoutSim(*ehead,*thead,srhead);
00382     if (sc.isFailure() || !srhead) {
00383         error() << "fillReadouts(): Failed to run ReadoutSim" << endreq;
00384         return StatusCode::FAILURE;
00385     }
00386     // set input headers
00387     AppendInputHeader(thead);
00388 
00389     return StatusCode::SUCCESS;
00390 }
00391 
00392 StatusCode TrigReadProc::fastTrigReadSim(const ElecHeader* ehead,SimReadoutHeader*& srhead)
00393 {
00394     SimTrigHeader *sthead = new SimTrigHeader;
00395 
00396     StatusCode sc;
00397     sc = this->m_fastTool->mutate( srhead, sthead, *ehead );
00398     if (sc.isFailure()) return sc;
00399 
00401     sthead->setContext( ehead->context());
00402     sthead->setTimeStamp( ehead->timeStamp());
00403     sthead->setEarliest( ehead->earliest());
00404     sthead->setLatest( ehead->latest());
00405     //debug()<<"sthead earliest "<<sthead->earliest()<<endreq;
00406 
00407     srhead->setContext( ehead->context());
00408     srhead->setTimeStamp( ehead->timeStamp());
00409     srhead->setEarliest( ehead->earliest());
00410     srhead->setLatest( ehead->latest());
00411     //debug()<<"srhead earliest "<<srhead->earliest()<<endreq;
00412 
00413     // put trigger header into TES
00414     put( sthead, sthead->defaultLocation());
00415 
00416     // set input headers
00417     std::vector<const DayaBay::IHeader*> iElecHeaders;
00418     iElecHeaders.push_back( ehead );
00419     sthead->setInputHeaders( iElecHeaders );
00420 
00421     // set execution number
00422     sthead->setExecNumber(srhead->execNumber());
00423 
00424     // set input headers
00425     AppendInputHeader( sthead );
00426 
00427     return StatusCode::SUCCESS;
00428 }
00429     
00430 
00431 // Local Variables:
00432 // c-basic-offset: 4
00433 // End:
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 21:02:48 2011 for TrigReadProc by doxygen 1.4.7