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

In This Package:

SingleLoader.cc

Go to the documentation of this file.
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:49:08 2011 for SingleLoader by doxygen 1.4.7