#include <SingleLoader.h>
Inheritance diagram for SingleLoader:
Public Member Functions | |
SingleLoader (const std::string &name, ISvcLocator *pSvcLocator) | |
virtual | ~SingleLoader () |
virtual StatusCode | initialize () |
virtual StatusCode | execute () |
virtual StatusCode | finalize () |
StatusCode | registerData (IStageData &data) |
IStage * | thisStage () |
IStage * | lowerStage () |
Private Types | |
typedef HeaderStageData< SimReadoutHeader > | SimReadoutData |
typedef HeaderStageData< ReadoutHeader > | ReadoutData |
typedef std::multimap< TimeStamp, Readout *, std::less< TimeStamp > > | ReadoutMultimap |
Private Member Functions | |
StatusCode | fillPipeline (SimReadoutHeader *pSimReadoutHeader) |
execution detail | |
Private Attributes | |
FFTimeStamp | m_currentTime |
The earliest (smallest) time which this has provided. | |
ReadoutMultimap | m_readoutMultimap |
SimReadoutHeader * | m_pCurrentSRHeader |
Definition at line 24 of file SingleLoader.h.
typedef HeaderStageData<SimReadoutHeader> SingleLoader::SimReadoutData [private] |
Definition at line 42 of file SingleLoader.h.
typedef HeaderStageData<ReadoutHeader> SingleLoader::ReadoutData [private] |
Definition at line 43 of file SingleLoader.h.
typedef std::multimap<TimeStamp,Readout*, std::less<TimeStamp> > SingleLoader::ReadoutMultimap [private] |
Definition at line 47 of file SingleLoader.h.
SingleLoader::SingleLoader | ( | const std::string & | name, | |
ISvcLocator * | pSvcLocator | |||
) |
Definition at line 9 of file SingleLoader.cc.
00010 : StageProcessor<ReadoutHeader>(name,pSvcLocator), 00011 m_pCurrentSRHeader(0) 00012 { 00013 }
SingleLoader::~SingleLoader | ( | ) | [virtual] |
StatusCode SingleLoader::initialize | ( | ) | [virtual] |
Reimplemented from StageProcessor< DayaBay::ReadoutHeader >.
Definition at line 20 of file SingleLoader.cc.
00021 { 00022 StatusCode status = this->StageProcessor<ReadoutHeader>::initialize(); 00023 if (status.isFailure()) return status; 00024 00025 m_readoutMultimap.clear(); 00026 00027 return StatusCode::SUCCESS; 00028 }
StatusCode SingleLoader::execute | ( | ) | [virtual] |
Definition at line 30 of file SingleLoader.cc.
00031 { 00032 debug()<<"executing... "<<endreq; 00033 // Only do anything if the current stage time has advanced beyond 00034 // the last time we ran. 00035 static bool first_time = true; 00036 if (!first_time && m_currentTime > thisStage()->currentTime()) { 00037 return StatusCode::SUCCESS; 00038 } 00039 first_time = false; 00040 00041 // preExecute 00042 StatusCode sc = this->preExecute(); 00043 if (sc.isFailure()) return sc; 00044 00045 00046 // keep trying until get at least one Readout in pipeline 00047 while(m_readoutMultimap.size()==0) { 00048 // get SimReadoutHeader 00049 IStageData* pIStageData = 0; 00050 sc = lowerStage()->nextElement(pIStageData); 00051 if (sc.isFailure()) return sc; 00052 00053 // cast it to SimReadoutData 00054 const SimReadoutData* input =0; 00055 try{ 00056 input = dynamic_cast<SimReadoutData*>(pIStageData); 00057 } 00058 catch(...) { 00059 error()<<"Failed to get SimReadoutData pointer"<<endreq; 00060 } 00061 // get SimReadoutHeader 00062 SimReadoutHeader* pSrHeader = &input->header(); 00063 00064 sc = this->fillPipeline(pSrHeader); 00065 if (sc.isFailure()) return sc; 00066 debug()<<"exec num "<<pSrHeader->execNumber()<<endreq; 00067 00068 // It will not be used again 00069 delete input; input = 0; 00070 } 00071 00072 // get the first Readout from pipeline 00073 ReadoutMultimap::iterator top=m_readoutMultimap.begin(); 00074 TimeStamp ts=top->first; 00075 Readout* pReadout=top->second; 00076 m_readoutMultimap.erase(top); 00077 00078 // define output header 00079 ReadoutHeader* pReadoutHeader=MakeHeaderObject(); 00080 pReadoutHeader->setReadout(pReadout); 00081 pReadout->setHeader(pReadoutHeader); 00082 00083 // set context and update detector and site infor 00084 Context context = m_pCurrentSRHeader->context(); 00085 // After spliting, the detector infor should be specific to it. 00086 DayaBay::Detector det(pReadout->detector()); 00087 context.SetSite(det.site()); 00088 context.SetDetId(det.detectorId()); 00089 00090 pReadoutHeader->setContext( context ); 00091 00092 // set its time 00093 pReadoutHeader->setEarliest(ts); 00094 pReadoutHeader->setLatest(ts); 00095 pReadoutHeader->setTimeStamp(ts); 00096 00097 // define ReadoutData 00098 ReadoutData* output=new ReadoutData(*pReadoutHeader); 00099 00100 // input header 00101 AppendInputHeader(m_pCurrentSRHeader); 00102 00103 // push out 00104 thisStage()->pushElement(output); 00105 this->registerData(*output); 00106 debug()<<"to grep: new data pushed out at time "<<output->time()<<endreq; 00107 00108 // update current time 00109 m_currentTime=output->time(); 00110 00111 // postExecute, in AES now 00112 sc = this->postExecute(); 00113 00114 return StatusCode::SUCCESS; 00115 }
StatusCode SingleLoader::finalize | ( | ) | [virtual] |
Definition at line 118 of file SingleLoader.cc.
00119 { 00120 return this->StageProcessor<ReadoutHeader>::finalize(); 00121 }
StatusCode SingleLoader::fillPipeline | ( | SimReadoutHeader * | pSimReadoutHeader | ) | [private] |
execution detail
Definition at line 123 of file SingleLoader.cc.
00124 { 00125 // m_pCurrentSRHeader might live multi execution cycles, protection needed. 00126 if(m_pCurrentSRHeader != 0) { 00127 m_pCurrentSRHeader->release(); 00128 } 00129 00130 debug() <<"Get pSimReadoutHeader at "<<pSimReadoutHeader<<endreq; 00131 SimReadoutHeader::SimReadoutContainer readouts = pSimReadoutHeader->readouts(); 00132 int size = readouts.size(); 00133 debug() << "It has "<<size<<" readouts"<<endreq; 00134 debug() << "TimeStamp "<<pSimReadoutHeader->timeStamp()<<endreq; 00135 debug() << "Earliest "<<pSimReadoutHeader->earliest()<<endreq; 00136 debug() << "Latest "<<pSimReadoutHeader->latest()<<endreq; 00137 00138 m_pCurrentSRHeader=pSimReadoutHeader; 00139 m_pCurrentSRHeader->addRef(); 00140 00141 DayaBay::SimReadoutHeader::SimReadoutContainer& sroc = pSimReadoutHeader->readouts(); 00142 for (size_t ind=0; ind<sroc.size(); ++ind) { 00143 DayaBay::SimReadout* pSimReadout = sroc[ind]; 00144 TimeStamp ts = pSimReadout->readout()->triggerTime(); 00145 00146 // The following deep copy or cast has very weird problem 00147 const DayaBay::Readout* pReadout = pSimReadout->readout(); 00148 DayaBay::Detector det(pReadout->detector()); 00149 00150 if(det.detectorId() == DetectorId::kAD1 00151 || det.detectorId() == DetectorId::kAD2 00152 || det.detectorId() == DetectorId::kAD3 00153 || det.detectorId() == DetectorId::kAD4 00154 || det.detectorId() == DetectorId::kIWS 00155 || det.detectorId() == DetectorId::kOWS){ 00156 00157 const DayaBay::ReadoutPmtCrate* pmtcrate = 0; 00158 try{ 00159 pmtcrate = dynamic_cast<const DayaBay::ReadoutPmtCrate*>(pReadout); 00160 } 00161 catch(...) { 00162 error()<<"Failed to get ReadoutPmtCrate pointer"<<endreq; 00163 } 00164 // create a new one, deep copy 00165 DayaBay::ReadoutPmtCrate *pout = new DayaBay::ReadoutPmtCrate(*pmtcrate); 00166 00167 m_readoutMultimap.insert(pair<TimeStamp,DayaBay::Readout*>(ts,pout)); 00168 00169 } else if( det.detectorId() == DetectorId::kRPC ) { 00170 const DayaBay::ReadoutRpcCrate* rpccrate = 0; 00171 try{ 00172 rpccrate = dynamic_cast<const DayaBay::ReadoutRpcCrate*>(pReadout); 00173 } 00174 catch(...) { 00175 error()<<"Failed to get ReadoutRpcCrate pointer"<<endreq; 00176 } 00177 // create a new one, deep copy 00178 DayaBay::ReadoutRpcCrate *pout = new DayaBay::ReadoutRpcCrate(*rpccrate); 00179 00180 m_readoutMultimap.insert(pair<TimeStamp,DayaBay::Readout*>(ts,pout)); 00181 00182 } else if( det.detectorId() == DetectorId::kUnknown ) { 00183 DayaBay::Readout *pout = new DayaBay::Readout(*pReadout); 00184 m_readoutMultimap.insert(pair<TimeStamp, DayaBay::Readout*>(ts,pout)); 00185 } 00186 } 00187 00188 debug() << "fillPipeline(): Adding " << sroc.size() << " Readout" << endreq; 00189 00190 return StatusCode::SUCCESS; 00191 }
StatusCode StageProcessor< DayaBay::ReadoutHeader >::registerData | ( | IStageData & | data | ) | [inherited] |
IStage * StageProcessor< DayaBay::ReadoutHeader >::thisStage | ( | ) | [inherited] |
IStage * StageProcessor< DayaBay::ReadoutHeader >::lowerStage | ( | ) | [inherited] |
FFTimeStamp SingleLoader::m_currentTime [private] |
Definition at line 48 of file SingleLoader.h.
SimReadoutHeader* SingleLoader::m_pCurrentSRHeader [private] |
Definition at line 51 of file SingleLoader.h.