00001 #include "ReconAlg.h" 00002 #include "ReconAlg/IReconTool.h" 00003 00004 #include "Conventions/Reconstruction.h" 00005 #include "Event/CalibReadoutHeader.h" 00006 #include "Event/CalibReadout.h" 00007 00008 #include "Event/RecTrigger.h" 00009 00010 #include <vector> 00011 00012 ReconAlg::ReconAlg(const std::string& name, ISvcLocator* pSvcLocator) 00013 : DybAlgorithm<DayaBay::RecHeader>(name,pSvcLocator) 00014 { 00015 declareProperty("calibLocation", 00016 m_calibLocation=DayaBay::CalibReadoutHeaderLocation::Default, 00017 "CalibReadoutHeader location in the TES."); 00018 00019 declareProperty("ReconTools", m_reconToolNames, 00020 "List of Reconstruction tools"); 00021 00022 } 00023 00024 ReconAlg::~ReconAlg() 00025 { 00026 } 00027 00028 StatusCode ReconAlg::initialize() 00029 { 00030 // Setup reconstruction styles and get tools 00031 for(unsigned int toolIdx = 0; toolIdx < m_reconToolNames.size(); toolIdx++){ 00032 std::string toolName = m_reconToolNames[toolIdx]; 00033 IReconTool* currentTool = 0; 00034 try { 00035 currentTool = tool<IReconTool>(toolName); 00036 } 00037 catch(const GaudiException& exg) { 00038 fatal() << "Failed to get Recon tool: \"" << toolName << "\"" << endreq; 00039 return StatusCode::FAILURE; 00040 } 00041 m_reconTools.push_back(currentTool); 00042 info() << "Added recon tool " << toolName << " to path " 00043 << this->Location() << endreq; 00044 } 00045 00046 return StatusCode::SUCCESS; 00047 } 00048 00049 StatusCode ReconAlg::execute() 00050 { 00051 StatusCode sc; 00052 00053 // Create output rec header 00054 DayaBay::RecHeader* recHeader = MakeHeaderObject(); 00055 00056 // Get CalibHeader from TES 00057 DayaBay::CalibReadoutHeader* calibHeader = 00058 getTES<DayaBay::CalibReadoutHeader>(m_calibLocation); 00059 if(!calibHeader) { 00060 error() << "Get no CalibHeader from TES!!" << endreq; 00061 return StatusCode::FAILURE; 00062 } 00063 00064 Context context = calibHeader->context(); 00065 recHeader->setContext(context); 00066 recHeader->setEarliest(calibHeader->earliest()); 00067 recHeader->setLatest(calibHeader->latest()); 00068 00069 DayaBay::RecTrigger& recTrigger = recHeader->recTrigger(); 00070 00071 // Get Calibrated Readout 00072 const DayaBay::CalibReadout* calibReadout = calibHeader->calibReadout(); 00073 if(!calibReadout) { 00074 info() << "No CalibReadout retrieved this cycle." << endreq; 00075 recTrigger.setEnergyStatus(ReconStatus::kUnknown); 00076 recTrigger.setPositionStatus(ReconStatus::kUnknown); 00077 recTrigger.setDirectionStatus(ReconStatus::kUnknown); 00078 return StatusCode::SUCCESS; 00079 } 00080 00081 // Get detector / trigger information 00082 DayaBay::Detector det = calibReadout->detector(); 00083 unsigned int triggerNumber = calibReadout->triggerNumber(); 00084 const TimeStamp triggerTime = calibReadout->triggerTime(); 00085 const DayaBay::Trigger::TriggerType_t triggerType 00086 = calibReadout->triggerType(); 00087 00088 recTrigger.setDetector(det); 00089 recTrigger.setTriggerNumber(triggerNumber); 00090 recTrigger.setTriggerTime(triggerTime); 00091 recTrigger.setTriggerType(triggerType); 00092 00093 // Run the recon tools for this style 00094 for(unsigned int toolIdx = 0; toolIdx < m_reconTools.size(); toolIdx++){ 00095 sc = m_reconTools[toolIdx]->reconstruct(*calibReadout, recTrigger); 00096 if(sc != StatusCode::SUCCESS) return sc; 00097 } 00098 00099 return StatusCode::SUCCESS; 00100 } 00101 00102 StatusCode ReconAlg::finalize() 00103 { 00104 return this->GaudiAlgorithm::finalize(); 00105 }