Back to home page

sPhenix code displayed by LXR

 
 

    


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* /*topNode*/)
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