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

In This Package:

SingleLoader Class Reference

#include <SingleLoader.h>

Inheritance diagram for SingleLoader:

[legend]
Collaboration diagram for SingleLoader:
[legend]
List of all members.

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)
IStagethisStage ()
IStagelowerStage ()

Private Types

typedef HeaderStageData< SimReadoutHeaderSimReadoutData
typedef HeaderStageData< ReadoutHeaderReadoutData
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
SimReadoutHeaderm_pCurrentSRHeader

Detailed Description

Definition at line 24 of file SingleLoader.h.


Member Typedef Documentation

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.


Constructor & Destructor Documentation

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]

Definition at line 15 of file SingleLoader.cc.

00016 {
00017 }


Member Function Documentation

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]


Member Data Documentation

FFTimeStamp SingleLoader::m_currentTime [private]

The earliest (smallest) time which this has provided.

Definition at line 37 of file SingleLoader.h.

ReadoutMultimap SingleLoader::m_readoutMultimap [private]

Definition at line 48 of file SingleLoader.h.

SimReadoutHeader* SingleLoader::m_pCurrentSRHeader [private]

Definition at line 51 of file SingleLoader.h.


The documentation for this class was generated from the following files:
| 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