File indexing completed on 2025-08-05 08:11:10
0001 #include "caloTowerEmbed.h"
0002
0003 #include <calobase/TowerInfo.h> // for TowerInfo
0004 #include <calobase/TowerInfoContainer.h>
0005 #include <calobase/TowerInfoContainerv1.h>
0006 #include <calobase/TowerInfoContainerv2.h>
0007 #include <calobase/TowerInfov1.h>
0008 #include <calobase/TowerInfoDefs.h>
0009 #include <calobase/RawTowerGeom.h>
0010 #include <calobase/RawTowerGeomContainer.h>
0011
0012 #include <cdbobjects/CDBTTree.h> // for CDBTTree
0013
0014 #include <ffamodules/CDBInterface.h>
0015
0016 #include <ffaobjects/EventHeader.h>
0017
0018 #include <fun4all/Fun4AllServer.h>
0019 #include <fun4all/Fun4AllReturnCodes.h>
0020 #include <fun4all/SubsysReco.h> // for SubsysReco
0021
0022 #include <phool/PHCompositeNode.h>
0023 #include <phool/PHIODataNode.h> // for PHIODataNode
0024 #include <phool/PHNode.h> // for PHNode
0025 #include <phool/PHNodeIterator.h> // for PHNodeIterator
0026 #include <phool/PHObject.h> // for PHObject
0027 #include <phool/getClass.h>
0028 #include <phool/phool.h>
0029 #include <phool/recoConsts.h>
0030
0031 #include <cstdlib> // for exit
0032 #include <exception> // for exception
0033 #include <iostream> // for operator<<, basic_ostream
0034 #include <stdexcept> // for runtime_error
0035
0036
0037
0038 caloTowerEmbed::caloTowerEmbed(const std::string &name)
0039 : SubsysReco(name)
0040 , m_runNumber(-1)
0041 , m_eventNumber(-1)
0042 {
0043 std::cout << "caloTowerEmbed::caloTowerEmbed(const std::string &name) Calling ctor" << std::endl;
0044 }
0045
0046
0047 caloTowerEmbed::~caloTowerEmbed()
0048 {
0049 std::cout << "caloTowerEmbed::~caloTowerEmbed() Calling dtor" << std::endl;
0050 }
0051
0052
0053 int caloTowerEmbed::InitRun(PHCompositeNode *topNode)
0054 {
0055
0056 Fun4AllServer *se = Fun4AllServer::instance();
0057
0058 PHCompositeNode *simTopNode = se->topNode("TOPSim");
0059
0060 EventHeader *evtHeader = findNode::getClass<EventHeader>(topNode, "EventHeader");
0061
0062 if (evtHeader)
0063 {
0064 m_runNumber = evtHeader->get_RunNumber();
0065 }
0066 else
0067 {
0068 m_runNumber = -1;
0069 }
0070 if(Verbosity()) std::cout << "at run" << m_runNumber << std::endl;
0071
0072 try
0073 {
0074 CreateNodeTree(topNode);
0075 }
0076 catch (std::exception &e)
0077 {
0078 std::cout << e.what() << std::endl;
0079 return Fun4AllReturnCodes::ABORTRUN;
0080 }
0081 topNode->print();
0082 simTopNode->print();
0083
0084 return Fun4AllReturnCodes::EVENT_OK;
0085 }
0086
0087
0088 int caloTowerEmbed::process_event(PHCompositeNode* topNode)
0089 {
0090 ++m_eventNumber;
0091
0092 for(int caloIndex=0; caloIndex<3; caloIndex++){
0093
0094 if(Verbosity()) std::cout << "event " << m_eventNumber << " working on caloIndex " << caloIndex;
0095 if(caloIndex == 0) std::cout << " CEMC" << std::endl;
0096 else if(caloIndex == 1) std::cout << " HCALIN" << std::endl;
0097 else if(caloIndex == 2) std::cout << " HCALOUT" << std::endl;
0098 RawTowerDefs::keytype keyData = 0;
0099 RawTowerDefs::keytype keySim = 0;
0100
0101 unsigned int ntowers = _data_towers[caloIndex]->size();
0102 for (unsigned int channel = 0; channel < ntowers; channel++)
0103 {
0104 unsigned int data_key = _data_towers[caloIndex]->encode_key(channel);
0105 unsigned int sim_key = _sim_towers[caloIndex]->encode_key(channel);
0106
0107 int ieta_data = _data_towers[caloIndex]->getTowerEtaBin(data_key);
0108 int iphi_data = _data_towers[caloIndex]->getTowerPhiBin(data_key);
0109 int ieta_sim = _sim_towers[caloIndex]->getTowerEtaBin(sim_key);
0110 int iphi_sim = _sim_towers[caloIndex]->getTowerPhiBin(sim_key);
0111
0112 if(caloIndex == 0){
0113 if(!m_useRetower){
0114 keyData = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::CEMC, ieta_data, iphi_data);
0115 keySim = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::CEMC, ieta_sim, iphi_sim);
0116 }
0117 else{
0118 keyData = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, ieta_data, iphi_data);
0119 keySim = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, ieta_sim, iphi_sim);
0120 }
0121 }else if(caloIndex == 1){
0122 keyData = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, ieta_data, iphi_data);
0123 keySim = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, ieta_sim, iphi_sim);
0124 }else if(caloIndex == 2){
0125 keyData = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALOUT, ieta_data, iphi_data);
0126 keySim = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALOUT, ieta_sim, iphi_sim);
0127 }
0128
0129 TowerInfo *caloinfo_data = _data_towers[caloIndex]->get_tower_at_channel(channel);
0130 TowerInfo *caloinfo_sim = _sim_towers[caloIndex]->get_tower_at_channel(channel);
0131
0132 float data_E = caloinfo_data->get_energy();
0133 float sim_E = caloinfo_sim->get_energy();
0134 float embed_E = data_E + sim_E;
0135
0136 float data_phi = 0.0;
0137 float sim_phi = 0.0;
0138
0139 float data_eta = 0.0;
0140 float sim_eta = 0.0;
0141
0142 if(caloIndex == 0){
0143 if(!m_useRetower){
0144 data_phi = tower_geom->get_tower_geometry(keyData)->get_phi();
0145 data_eta = tower_geom->get_tower_geometry(keyData)->get_eta();
0146
0147 sim_phi = tower_geom->get_tower_geometry(keySim)->get_phi();
0148 sim_eta = tower_geom->get_tower_geometry(keySim)->get_eta();
0149 }else{
0150 data_phi = tower_geomIH->get_tower_geometry(keyData)->get_phi();
0151 data_eta = tower_geomIH->get_tower_geometry(keyData)->get_eta();
0152
0153 sim_phi = tower_geomIH->get_tower_geometry(keySim)->get_phi();
0154 sim_eta = tower_geomIH->get_tower_geometry(keySim)->get_eta();
0155 }
0156
0157 if(data_phi == sim_phi && data_eta == sim_eta){
0158 _data_towers[caloIndex]->get_tower_at_channel(channel)->set_energy(embed_E);
0159 }else{
0160 if(Verbosity()) std::cout << "eta and phi values in CEMC do not match between data and simulation, removing this event" << std::endl;
0161 return Fun4AllReturnCodes::ABORTEVENT;
0162 }
0163
0164 }else if(caloIndex == 1){
0165 data_phi = tower_geomIH->get_tower_geometry(keyData)->get_phi();
0166 data_eta = tower_geomIH->get_tower_geometry(keyData)->get_eta();
0167
0168 sim_phi = tower_geomIH->get_tower_geometry(keySim)->get_phi();
0169 sim_eta = tower_geomIH->get_tower_geometry(keySim)->get_eta();
0170
0171 if(data_phi == sim_phi && data_eta == sim_eta){
0172 _data_towers[caloIndex]->get_tower_at_channel(channel)->set_energy(embed_E);
0173 }else{
0174 if(Verbosity()) std::cout << "eta and phi values in HCALIN do not match between data and simulation, removing this event" << std::endl;
0175 return Fun4AllReturnCodes::ABORTEVENT;
0176 }
0177
0178 }else if(caloIndex == 2){
0179 data_phi = tower_geomOH->get_tower_geometry(keyData)->get_phi();
0180 data_eta = tower_geomOH->get_tower_geometry(keyData)->get_eta();
0181
0182 sim_phi = tower_geomOH->get_tower_geometry(keySim)->get_phi();
0183 sim_eta = tower_geomOH->get_tower_geometry(keySim)->get_eta();
0184
0185 if(data_phi == sim_phi && data_eta == sim_eta){
0186 _data_towers[caloIndex]->get_tower_at_channel(channel)->set_energy(embed_E);
0187 }else{
0188 if(Verbosity()) std::cout << "eta and phi values in HCALOUT do not match between data and simulation, removing this event" << std::endl;
0189 return Fun4AllReturnCodes::ABORTEVENT;
0190 }
0191
0192 }
0193 }
0194 }
0195
0196 return Fun4AllReturnCodes::EVENT_OK;
0197 }
0198
0199 int caloTowerEmbed::End(PHCompositeNode *topNode)
0200 {
0201
0202 return Fun4AllReturnCodes::EVENT_OK;
0203
0204 }
0205
0206 void caloTowerEmbed::CreateNodeTree(PHCompositeNode *topNode)
0207 {
0208 std::cout << "creating node" << std::endl;
0209
0210 Fun4AllServer *se = Fun4AllServer::instance();
0211 PHCompositeNode *simTopNode = se->topNode("TOPSim");
0212
0213 tower_geom = findNode::getClass<RawTowerGeomContainer>(topNode, "TOWERGEOM_CEMC");
0214 if(!tower_geom){
0215 std::cerr << Name() << "::" << __PRETTY_FUNCTION__
0216 << "tower geom CEMC missing, doing nothing." << std::endl;
0217 throw std::runtime_error(
0218 "Failed to find TOWERGEOM_CEMC node");
0219 }
0220
0221 tower_geomIH = findNode::getClass<RawTowerGeomContainer>(topNode, "TOWERGEOM_HCALIN");
0222 if(!tower_geomIH){
0223 std::cerr << Name() << "::" << __PRETTY_FUNCTION__
0224 << "tower geom HCALIN missing, doing nothing." << std::endl;
0225 throw std::runtime_error(
0226 "Failed to find TOWERGEOM_HCALIN node");
0227 }
0228
0229
0230 tower_geomOH = findNode::getClass<RawTowerGeomContainer>(topNode, "TOWERGEOM_HCALOUT");
0231 if(!tower_geomOH){
0232 std::cerr << Name() << "::" << __PRETTY_FUNCTION__
0233 << "tower geom HCALOUT missing, doing nothing." << std::endl;
0234 throw std::runtime_error(
0235 "Failed to find TOWERGEOM_HCALOUT node");
0236 }
0237
0238 PHNodeIterator dataIter(topNode);
0239 PHNodeIterator simIter(simTopNode);
0240
0241
0242
0243 PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(dataIter.findFirst(
0244 "PHCompositeNode", "DST"));
0245 if (!dstNode)
0246 {
0247 std::cerr << Name() << "::" << __PRETTY_FUNCTION__
0248 << "DST Node missing, doing nothing." << std::endl;
0249 throw std::runtime_error(
0250 "Failed to find DST node in RawTowerCalibration::CreateNodes");
0251 }
0252
0253
0254 PHCompositeNode *dstNodeSim = dynamic_cast<PHCompositeNode *>(simIter.findFirst(
0255 "PHCompositeNode", "DST"));
0256 if (!dstNodeSim)
0257 {
0258 std::cerr << Name() << "::" << __PRETTY_FUNCTION__
0259 << "DSTsim Node missing, doing nothing." << std::endl;
0260 throw std::runtime_error(
0261 "Failed to find DSTsim node in RawTowerCalibration::CreateNodes");
0262 }
0263
0264 for(int i=0; i<3; i++){
0265
0266 std::string detector = "CEMC";
0267 if(i==0 && m_useRetower) detector = "CEMC_RETOWER";
0268 if(i==1) detector = "HCALIN";
0269 else if(i==2) detector = "HCALOUT";
0270
0271
0272
0273 std::string DataTowerNodeName = "TOWERINFO_CALIB_" + detector;
0274 _data_towers[i] = findNode::getClass<TowerInfoContainer>(dstNode,
0275 DataTowerNodeName);
0276 if (!_data_towers[i])
0277 {
0278 std::cerr << Name() << "::" << detector << "::" << __PRETTY_FUNCTION__
0279 << "Tower Calib Node missing, doing nothing." << std::endl;
0280 throw std::runtime_error(
0281 "Failed to find Calib Tower node in caloTowerEmbed::CreateNodes");
0282 }
0283
0284
0285
0286 std::string SimTowerNodeName = "TOWERINFO_CALIB_" + detector;
0287 _sim_towers[i] = findNode::getClass<TowerInfoContainer>(dstNodeSim,
0288 SimTowerNodeName);
0289 if (!_sim_towers[i])
0290 {
0291 std::cerr << Name() << "::" << detector << "::" << __PRETTY_FUNCTION__
0292 << "Tower Calib Sim Node missing, doing nothing." << std::endl;
0293 throw std::runtime_error(
0294 "Failed to find Calib Tower Sim node in caloTowerEmbed::CreateNodes");
0295 }
0296
0297 }
0298
0299 return;
0300 }