File indexing completed on 2025-08-06 08:18:52
0001 #include "RawTowerBuilderByHitIndex.h"
0002
0003 #include <calobase/RawTowerContainer.h>
0004 #include <calobase/RawTowerv1.h>
0005
0006 #include <calobase/RawTower.h> // for RawTower
0007 #include <calobase/RawTowerDefs.h> // for convert_name_to_caloid
0008 #include <calobase/RawTowerGeom.h> // for RawTowerGeom
0009 #include <calobase/RawTowerGeomContainer.h> // for RawTowerGeomContainer
0010 #include <calobase/RawTowerGeomContainerv1.h>
0011 #include <calobase/RawTowerGeomv3.h>
0012
0013 #include <g4main/PHG4Hit.h>
0014 #include <g4main/PHG4HitContainer.h>
0015
0016 #include <fun4all/Fun4AllReturnCodes.h>
0017 #include <fun4all/SubsysReco.h> // for SubsysReco
0018
0019 #include <phool/PHCompositeNode.h>
0020 #include <phool/PHIODataNode.h>
0021 #include <phool/PHNode.h> // for PHNode
0022 #include <phool/PHNodeIterator.h>
0023 #include <phool/PHObject.h> // for PHObject
0024 #include <phool/getClass.h>
0025 #include <phool/phool.h> // for PHWHERE
0026
0027 #include <TRotation.h>
0028 #include <TVector3.h>
0029
0030 #include <cstdlib> // for exit
0031 #include <exception> // for exception
0032 #include <fstream>
0033 #include <iostream>
0034 #include <map>
0035 #include <sstream>
0036 #include <stdexcept>
0037 #include <utility> // for pair, make_pair
0038
0039 RawTowerBuilderByHitIndex::RawTowerBuilderByHitIndex(const std::string &name)
0040 : SubsysReco(name)
0041 {
0042 }
0043
0044 int RawTowerBuilderByHitIndex::InitRun(PHCompositeNode *topNode)
0045 {
0046 PHNodeIterator iter(topNode);
0047
0048
0049 PHCompositeNode *dstNode;
0050 dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0051 if (!dstNode)
0052 {
0053 std::cout << PHWHERE << "DST Node missing, doing nothing." << std::endl;
0054 exit(1);
0055 }
0056
0057 try
0058 {
0059 CreateNodes(topNode);
0060 }
0061 catch (std::exception &e)
0062 {
0063 std::cout << e.what() << std::endl;
0064
0065 }
0066
0067 try
0068 {
0069 ReadGeometryFromTable();
0070 }
0071 catch (std::exception &e)
0072 {
0073 std::cout << e.what() << std::endl;
0074
0075 }
0076
0077 return Fun4AllReturnCodes::EVENT_OK;
0078 }
0079
0080 int RawTowerBuilderByHitIndex::process_event(PHCompositeNode *topNode)
0081 {
0082
0083 std::string NodeNameHits = "G4HIT_" + m_Detector;
0084 PHG4HitContainer *g4hit = findNode::getClass<PHG4HitContainer>(topNode, NodeNameHits);
0085 if (!g4hit)
0086 {
0087 std::cout << "Could not locate g4 hit node " << NodeNameHits << std::endl;
0088 exit(1);
0089 }
0090
0091
0092 PHG4HitContainer::ConstIterator hiter;
0093 PHG4HitContainer::ConstRange hit_begin_end = g4hit->getHits();
0094
0095 for (hiter = hit_begin_end.first; hiter != hit_begin_end.second; hiter++)
0096 {
0097 PHG4Hit *g4hit_i = hiter->second;
0098
0099
0100 if (g4hit_i->get_edep() <= 0 && g4hit_i->get_edep() != -1)
0101 {
0102 continue;
0103 }
0104
0105
0106 RawTowerDefs::keytype calotowerid = RawTowerDefs::encode_towerid(m_CaloId,
0107 g4hit_i->get_index_j(),
0108 g4hit_i->get_index_k());
0109
0110
0111 RawTowerv1 *tower = dynamic_cast<RawTowerv1 *>(m_Towers->getTower(calotowerid));
0112 if (!tower)
0113 {
0114 tower = new RawTowerv1(calotowerid);
0115 tower->set_energy(0);
0116 m_Towers->AddTower(tower->get_id(), tower);
0117 }
0118
0119 tower->add_ecell(((unsigned int) (g4hit_i->get_index_j()) << 16U) + g4hit_i->get_index_k(), g4hit_i->get_light_yield());
0120 tower->set_energy(tower->get_energy() + g4hit_i->get_light_yield());
0121 tower->add_eshower(g4hit_i->get_shower_id(), g4hit_i->get_edep());
0122 }
0123
0124 float towerE = 0.;
0125
0126 if (Verbosity())
0127 {
0128 towerE = m_Towers->getTotalEdep();
0129 std::cout << "towers before compression: " << m_Towers->size() << "\t" << m_Detector << std::endl;
0130 }
0131 m_Towers->compress(m_Emin);
0132 if (Verbosity())
0133 {
0134 std::cout << "storing towers: " << m_Towers->size() << std::endl;
0135 std::cout << "Energy lost by dropping towers with less than " << m_Emin
0136 << " energy, lost energy: " << towerE - m_Towers->getTotalEdep() << std::endl;
0137 m_Towers->identify();
0138 RawTowerContainer::ConstRange begin_end = m_Towers->getTowers();
0139 RawTowerContainer::ConstIterator iter;
0140 for (iter = begin_end.first; iter != begin_end.second; ++iter)
0141 {
0142 iter->second->identify();
0143 }
0144 }
0145
0146 return Fun4AllReturnCodes::EVENT_OK;
0147 }
0148
0149 int RawTowerBuilderByHitIndex::End(PHCompositeNode * )
0150 {
0151 return Fun4AllReturnCodes::EVENT_OK;
0152 }
0153
0154 void RawTowerBuilderByHitIndex::Detector(const std::string &d)
0155 {
0156 m_Detector = d;
0157 m_CaloId = RawTowerDefs::convert_name_to_caloid(m_Detector);
0158 }
0159
0160 void RawTowerBuilderByHitIndex::CreateNodes(PHCompositeNode *topNode)
0161 {
0162 PHNodeIterator iter(topNode);
0163 PHCompositeNode *runNode = static_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0164 if (!runNode)
0165 {
0166 std::cout << PHWHERE << "Run Node missing, doing nothing." << std::endl;
0167 throw std::runtime_error("Failed to find Run node in RawTowerBuilderByHitIndex::CreateNodes");
0168 }
0169
0170 PHCompositeNode *dstNode = static_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0171 if (!dstNode)
0172 {
0173 std::cout << PHWHERE << "DST Node missing, doing nothing." << std::endl;
0174 throw std::runtime_error("Failed to find DST node in RawTowerBuilderByHitIndex::CreateNodes");
0175 }
0176
0177
0178 m_Geoms = new RawTowerGeomContainerv1(RawTowerDefs::convert_name_to_caloid(m_Detector));
0179 std::string NodeNameTowerGeometries = "TOWERGEOM_" + m_Detector;
0180
0181 PHIODataNode<PHObject> *geomNode = new PHIODataNode<PHObject>(m_Geoms, NodeNameTowerGeometries, "PHObject");
0182 runNode->addNode(geomNode);
0183
0184
0185 PHNodeIterator dstiter(dstNode);
0186 PHCompositeNode *DetNode = dynamic_cast<PHCompositeNode *>(dstiter.findFirst(
0187 "PHCompositeNode", m_Detector));
0188 if (!DetNode)
0189 {
0190 DetNode = new PHCompositeNode(m_Detector);
0191 dstNode->addNode(DetNode);
0192 }
0193
0194
0195 m_Towers = new RawTowerContainer(RawTowerDefs::convert_name_to_caloid(m_Detector));
0196 std::string NodeNameTowers;
0197 if (m_SimTowerNodePrefix.empty())
0198 {
0199
0200 NodeNameTowers = "TOWER_" + m_Detector;
0201 }
0202 else
0203 {
0204 NodeNameTowers = "TOWER_" + m_SimTowerNodePrefix + "_" + m_Detector;
0205 }
0206
0207 PHIODataNode<PHObject> *towerNode = new PHIODataNode<PHObject>(m_Towers, NodeNameTowers, "PHObject");
0208 DetNode->addNode(towerNode);
0209
0210 return;
0211 }
0212
0213 bool RawTowerBuilderByHitIndex::ReadGeometryFromTable()
0214 {
0215
0216 std::ifstream istream_mapping;
0217
0218
0219 if (!istream_mapping.is_open())
0220 {
0221 istream_mapping.open(m_MappingTowerFile);
0222 if (!istream_mapping)
0223 {
0224 std::cout << "CaloTowerGeomManager::ReadGeometryFromTable - ERROR Failed to open mapping file " << m_MappingTowerFile << std::endl;
0225 exit(1);
0226 }
0227 }
0228
0229 std::string line_mapping;
0230
0231 while (getline(istream_mapping, line_mapping))
0232 {
0233
0234 if (line_mapping.find('#') != std::string::npos)
0235 {
0236 if (Verbosity() > 0)
0237 {
0238 std::cout << "RawTowerBuilderByHitIndex: SKIPPING line in mapping file: " << line_mapping << std::endl;
0239 }
0240 continue;
0241 }
0242
0243 std::istringstream iss(line_mapping);
0244
0245
0246 if (line_mapping.find("Tower ") != std::string::npos)
0247 {
0248 unsigned idx_j, idx_k, idx_l;
0249 double pos_x, pos_y, pos_z;
0250 double size_x, size_y, size_z;
0251 double rot_x, rot_y, rot_z;
0252 double type;
0253 std::string dummys;
0254
0255
0256 if (!(iss >> dummys >> type >> idx_j >> idx_k >> idx_l >> pos_x >> pos_y >> pos_z >> size_x >> size_y >> size_z >> rot_x >> rot_y >> rot_z))
0257 {
0258 std::cout << "ERROR in RawTowerBuilderByHitIndex: Failed to read line in mapping file " << m_MappingTowerFile << std::endl;
0259 exit(1);
0260 }
0261
0262
0263 unsigned int temp_id = RawTowerDefs::encode_towerid(m_CaloId, idx_j, idx_k);
0264
0265
0266 RawTowerGeom *temp_geo = new RawTowerGeomv3(temp_id);
0267 temp_geo->set_center_x(pos_x);
0268 temp_geo->set_center_y(pos_y);
0269 temp_geo->set_center_z(pos_z);
0270 temp_geo->set_size_x(size_x);
0271 temp_geo->set_size_y(size_y);
0272 temp_geo->set_size_z(size_z);
0273 temp_geo->set_tower_type((int) type);
0274
0275
0276 m_Geoms->add_tower_geometry(temp_geo);
0277 }
0278
0279 else
0280 {
0281
0282 std::string parname;
0283 double parval;
0284
0285
0286 if (!(iss >> parname >> parval))
0287 {
0288 std::cout << "ERROR in RawTowerBuilderByHitIndex: Failed to read line in mapping file " << m_MappingTowerFile << std::endl;
0289 exit(1);
0290 }
0291
0292 m_GlobalParameterMap.insert(std::make_pair(parname, parval));
0293 }
0294 }
0295
0296
0297 std::map<std::string, double>::iterator parit;
0298
0299 parit = m_GlobalParameterMap.find("Gx0");
0300 if (parit != m_GlobalParameterMap.end())
0301 {
0302 m_GlobalPlaceInX = parit->second;
0303 }
0304
0305 parit = m_GlobalParameterMap.find("Gy0");
0306 if (parit != m_GlobalParameterMap.end())
0307 {
0308 m_GlobalPlaceInY = parit->second;
0309 }
0310
0311 parit = m_GlobalParameterMap.find("Gz0");
0312 if (parit != m_GlobalParameterMap.end())
0313 {
0314 m_GlobalPlaceInZ = parit->second;
0315 }
0316
0317 parit = m_GlobalParameterMap.find("Grot_x");
0318 if (parit != m_GlobalParameterMap.end())
0319 {
0320 m_RotInX = parit->second;
0321 }
0322
0323 parit = m_GlobalParameterMap.find("Grot_y");
0324 if (parit != m_GlobalParameterMap.end())
0325 {
0326 m_RotInY = parit->second;
0327 }
0328
0329 parit = m_GlobalParameterMap.find("Grot_z");
0330 if (parit != m_GlobalParameterMap.end())
0331 {
0332 m_RotInZ = parit->second;
0333 }
0334
0335
0336
0337 RawTowerGeomContainer::ConstRange all_towers = m_Geoms->get_tower_geometries();
0338
0339 for (RawTowerGeomContainer::ConstIterator it = all_towers.first;
0340 it != all_towers.second; ++it)
0341 {
0342 double x_temp = it->second->get_center_x();
0343 double y_temp = it->second->get_center_y();
0344 double z_temp = it->second->get_center_z();
0345
0346
0347 TRotation rot;
0348 rot.RotateX(m_RotInX);
0349 rot.RotateY(m_RotInY);
0350 rot.RotateZ(m_RotInZ);
0351
0352 TVector3 v_temp_r(x_temp, y_temp, z_temp);
0353 v_temp_r.Transform(rot);
0354
0355
0356 double x_temp_rt = v_temp_r.X() + m_GlobalPlaceInX;
0357 double y_temp_rt = v_temp_r.Y() + m_GlobalPlaceInY;
0358 double z_temp_rt = v_temp_r.Z() + m_GlobalPlaceInZ;
0359
0360
0361 it->second->set_center_x(x_temp_rt);
0362 it->second->set_center_y(y_temp_rt);
0363 it->second->set_center_z(z_temp_rt);
0364
0365 if (Verbosity() > 2)
0366 {
0367 std::cout << "* Local tower x y z : " << x_temp << " " << y_temp << " " << z_temp << std::endl;
0368 std::cout << "* Globl tower x y z : " << x_temp_rt << " " << y_temp_rt << " " << z_temp_rt << std::endl;
0369 }
0370 }
0371
0372 if (Verbosity())
0373 {
0374 std::cout << "size tower geom container:" << m_Geoms->size() << "\t" << m_Detector << std::endl;
0375 }
0376 return true;
0377 }