File indexing completed on 2026-04-02 08:12:39
0001 #include "CombineTowerInfo.h"
0002
0003 #include <calobase/TowerInfo.h>
0004 #include <calobase/TowerInfoContainer.h>
0005
0006 #include <fun4all/Fun4AllReturnCodes.h>
0007
0008 #include <phool/PHCompositeNode.h>
0009 #include <phool/PHIODataNode.h>
0010 #include <phool/PHNodeIterator.h>
0011 #include <phool/getClass.h>
0012
0013 #include <iostream>
0014 #include <stdexcept>
0015
0016
0017 CombineTowerInfo::CombineTowerInfo(const std::string& name)
0018 : SubsysReco(name)
0019 {
0020 }
0021
0022
0023 int CombineTowerInfo::InitRun(PHCompositeNode* topNode)
0024 {
0025 if (m_inputNodeA.empty() || m_inputNodeB.empty() || m_outputNode.empty())
0026 {
0027 throw std::runtime_error("CombineTowerInfo: input/output node names not set");
0028 }
0029
0030 CreateNodes(topNode);
0031 return Fun4AllReturnCodes::EVENT_OK;
0032 }
0033
0034
0035 void CombineTowerInfo::CreateNodes(PHCompositeNode* topNode)
0036 {
0037 PHNodeIterator iter(topNode);
0038 PHCompositeNode* dstNode =
0039 dynamic_cast<PHCompositeNode*>(iter.findFirst("PHCompositeNode", "DST"));
0040
0041 if (!dstNode)
0042 {
0043 throw std::runtime_error("CombineTowerInfo: DST node not found");
0044 }
0045
0046 PHCompositeNode *DetNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", m_detector));
0047
0048 m_towersA = findNode::getClass<TowerInfoContainer>(topNode, m_inputNodeA);
0049 m_towersB = findNode::getClass<TowerInfoContainer>(topNode, m_inputNodeB);
0050
0051 if (!m_towersB)
0052 {
0053 std::cout << "CombineTowerInfo: " <<m_inputNodeB << " not found" << std::endl;
0054 throw std::runtime_error("CombineTowerInfo: input TowerInfoContainer missing");
0055 }
0056 if (!m_towersA)
0057 {
0058 std::cout << "CombineTowerInfo: " <<m_inputNodeA << " not found" << std::endl;
0059 throw std::runtime_error("CombineTowerInfo: input TowerInfoContainer missing");
0060 }
0061
0062 m_towersOut = findNode::getClass<TowerInfoContainer>(dstNode, m_outputNode);
0063 if (!m_towersOut)
0064 {
0065 m_towersOut =
0066 dynamic_cast<TowerInfoContainer*>(m_towersA->CloneMe());
0067
0068 auto* node = new PHIODataNode<PHObject>(
0069 m_towersOut, m_outputNode, "PHObject");
0070
0071 DetNode->addNode(node);
0072 }
0073
0074 if (m_towersA->size() != m_towersB->size())
0075 {
0076 throw std::runtime_error("CombineTowerInfo: input containers have different sizes");
0077 }
0078 }
0079
0080
0081 int CombineTowerInfo::process_event(PHCompositeNode* )
0082 {
0083 const unsigned int ntowers = m_towersA->size();
0084
0085 for (unsigned int ich = 0; ich < ntowers; ++ich)
0086 {
0087 TowerInfo* towerA = m_towersA->get_tower_at_channel(ich);
0088 TowerInfo* towerB = m_towersB->get_tower_at_channel(ich);
0089 TowerInfo* towerO = m_towersOut->get_tower_at_channel(ich);
0090
0091 towerO->copy_tower(towerA);
0092
0093 const float e_sum = towerA->get_energy() + towerB->get_energy();
0094 towerO->set_energy(e_sum);
0095 }
0096
0097 return Fun4AllReturnCodes::EVENT_OK;
0098 }
0099