/search.css" rel="stylesheet" type="text/css"/> /search.js">
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 // Look for pre-existing header object or make new one 00065 DayaBay::SimReadoutHeader* roHeader = MakeHeaderObject(); 00066 00067 //set readouts to have same validity range as the crate its read out from. 00068 // This can be refined later. 00069 DayaBay::ElecHeader* elecHeader = getTES<DayaBay::ElecHeader>(m_elecLocation); 00070 DayaBay::SimTrigHeader* trigHeader = getTES<DayaBay::SimTrigHeader>(m_trigLocation); 00071 00072 //roHeader->setTimeStamp(elecHeader->timeStamp()); // this seems redundant (and duplicating) when one looks at the line 78 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->fillDataPackages(trigPkgs,*trigHeader); 00090 00091 // Let each tool do its thing on the event 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 // HeaderObject base 00103 return StatusCode::SUCCESS; 00104 } 00105 00106 StatusCode ROsReadoutAlg::finalize() 00107 { 00108 m_roTools.clear(); 00109 00110 return this->GaudiAlgorithm::finalize(); 00111 }