00001 00002 #include "SingleLoader.h" 00003 00004 #include "Event/ReadoutPmtCrate.h" 00005 #include "Event/ReadoutRpcCrate.h" 00006 00007 using namespace std; 00008 00009 SingleLoader::SingleLoader(const std::string& name, ISvcLocator* pSvcLocator) 00010 : StageProcessor<ReadoutHeader>(name,pSvcLocator), 00011 m_pCurrentSRHeader(0) 00012 { 00013 } 00014 00015 SingleLoader::~SingleLoader() 00016 { 00017 } 00018 00019 00020 StatusCode SingleLoader::initialize() 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 } 00029 00030 StatusCode SingleLoader::execute() 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 } 00116 00117 00118 StatusCode SingleLoader::finalize() 00119 { 00120 return this->StageProcessor<ReadoutHeader>::finalize(); 00121 } 00122 00123 StatusCode SingleLoader::fillPipeline(SimReadoutHeader* pSimReadoutHeader) 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 } 00192 00193