00001 #include "ROsReadoutAlg.h"
00002 #include "ReadoutSim/IROsReadoutTool.h"
00003 #include "ReadoutSim/IROsTriggerDataPackerTool.h"
00004
00005 #include "Event/SimReadoutHeader.h"
00006 #include "Event/ReadoutTriggerDataPkg.h"
00007 #include "Event/SimTrigHeader.h"
00008 #include "Event/ElecHeader.h"
00009
00010 #include <vector>
00011
00012 ROsReadoutAlg::ROsReadoutAlg(const std::string& name, ISvcLocator* pSvcLocator)
00013 : DybAlgorithm<DayaBay::SimReadoutHeader>(name,pSvcLocator)
00014 {
00015 m_roToolNames.push_back("ROsFeeReadoutTool");
00016 m_roToolNames.push_back("ROsFecReadoutTool");
00017 declareProperty("RoTools",m_roToolNames,
00018 "Tools to generate Triggers");
00019 declareProperty("RoName", m_roName = "ReadoutAlg",
00020 "Name of this Trigger Algorithm for book keeping purposes.");
00021 declareProperty("TrigPackagerTool",m_roTrigPackName="ROsTriggerDataPackerTool",
00022 "Tool to convert trigger commands from TrigSim to TriggerDataPackage");
00023 declareProperty("TrigLocation",m_trigLocation=DayaBay::SimTrigHeaderLocation::Default,
00024 "Location in the TES where the output SimTrigHeader is to be found.");
00025 declareProperty("ElecLocation",m_elecLocation=DayaBay::ElecHeaderLocation::Default,
00026 "Location in the TES where the input ElecHeader is to be found.");
00027 }
00028
00029 ROsReadoutAlg::~ROsReadoutAlg()
00030 {
00031 }
00032
00033 StatusCode ROsReadoutAlg::initialize()
00034 {
00035
00037 try{
00038 m_roTrigPackTool = tool<IROsTriggerDataPackerTool>(m_roTrigPackName);
00039 }catch(const GaudiException& exg){
00040 fatal() << "Failed to get Readout Trigger Package Tool: \""
00041 << m_roTrigPackName << "\"" << endreq;
00042 return StatusCode::FAILURE;
00043 }
00044
00046 for (size_t ind=0; ind < m_roToolNames.size(); ++ind) {
00047 std::string rotool = m_roToolNames[ind];
00048 try{
00049 m_roTools.push_back(tool<IROsReadoutTool>(rotool));
00050 }catch(const GaudiException& exg) {
00051 fatal() << "Failed to get Readout Tool: \"" << rotool
00052 << "\"" << endreq;
00053 return StatusCode::FAILURE;
00054 }
00055 info () << "Added readout tool " << rotool << endreq;
00056 }
00057
00058 return StatusCode::SUCCESS;
00059 }
00060
00061 StatusCode ROsReadoutAlg::execute()
00062 {
00063 debug() << "Entering ROsReadoutAlg.execute()" << endreq;
00064
00065 DayaBay::SimReadoutHeader* roHeader = MakeHeaderObject();
00066
00067
00068
00069 DayaBay::ElecHeader* elecHeader = getTES<DayaBay::ElecHeader>(m_elecLocation);
00070 DayaBay::SimTrigHeader* trigHeader = getTES<DayaBay::SimTrigHeader>(m_trigLocation);
00071
00072 roHeader->setTimeStamp(elecHeader->timeStamp());
00073 TimeStamp earliest = elecHeader->earliest();
00074 TimeStamp latest = elecHeader->latest();
00075
00076 roHeader->setEarliest(earliest);
00077 roHeader->setLatest(latest);
00078 roHeader->setContext(elecHeader->context());
00079
00081 debug() << "Applying Trigger Data Packer Tool" << endreq;
00082
00084 std::vector<DayaBay::ReadoutTriggerDataPkg*> trigPkgs;
00085
00089 m_roTrigPackTool->fillDataPakages(trigPkgs,*trigHeader);
00090
00091
00092 for (size_t ind = 0; ind< m_roTools.size(); ++ind) {
00093 debug () << "Running trigger tool #" << ind << " " << m_roToolNames[ind] << endreq;
00094 if (m_roTools[ind]->mutate(roHeader,trigPkgs,*elecHeader).isFailure()) {
00095 fatal() << "Readout Tool " << m_roToolNames[ind]
00096 << " failed" << endreq;
00097 return StatusCode::FAILURE;
00098 }
00099 }
00100
00101 verbose() << *roHeader << endreq;
00102
00103 return StatusCode::SUCCESS;
00104 }
00105
00106 StatusCode ROsReadoutAlg::finalize()
00107 {
00108 m_roTools.clear();
00109
00110 return this->GaudiAlgorithm::finalize();
00111 }