File indexing completed on 2025-08-06 08:18:52
0001 #include "RawTowerDigitizer.h"
0002
0003 #include <calobase/RawTower.h> // for RawTower
0004 #include <calobase/RawTowerContainer.h>
0005 #include <calobase/RawTowerDeadMap.h>
0006 #include <calobase/RawTowerDefs.h> // for keytype
0007 #include <calobase/RawTowerGeom.h>
0008 #include <calobase/RawTowerGeomContainer.h>
0009 #include <calobase/RawTowerv2.h>
0010
0011 #include <calobase/TowerInfo.h>
0012 #include <calobase/TowerInfoContainer.h>
0013 #include <calobase/TowerInfoContainerv1.h>
0014 #include <calobase/TowerInfov1.h>
0015
0016 #include <phparameter/PHParameters.h>
0017
0018 #include <cdbobjects/CDBTTree.h>
0019
0020 #include <ffamodules/CDBInterface.h>
0021
0022 #include <fun4all/Fun4AllBase.h> // for Fun4AllBase::VERBOSITY_MORE
0023 #include <fun4all/Fun4AllReturnCodes.h>
0024 #include <fun4all/SubsysReco.h> // for SubsysReco
0025
0026 #include <phool/PHCompositeNode.h>
0027 #include <phool/PHIODataNode.h>
0028 #include <phool/PHNode.h> // for PHNode
0029 #include <phool/PHNodeIterator.h>
0030 #include <phool/PHObject.h> // for PHObject
0031 #include <phool/PHRandomSeed.h>
0032 #include <phool/getClass.h>
0033 #include <phool/phool.h> // for PHWHERE
0034
0035 #include <TSystem.h>
0036
0037 #include <gsl/gsl_cdf.h>
0038 #include <gsl/gsl_randist.h>
0039 #include <gsl/gsl_rng.h>
0040
0041 #include <cmath>
0042 #include <cstdlib> // for exit
0043 #include <exception> // for exception
0044 #include <iostream>
0045 #include <map>
0046 #include <stdexcept>
0047 #include <string>
0048 #include <utility> // for pair
0049
0050 RawTowerDigitizer::RawTowerDigitizer(const std::string &name)
0051 : SubsysReco(name)
0052 , _tower_params(name)
0053 {
0054 m_RandomGenerator = gsl_rng_alloc(gsl_rng_mt19937);
0055 m_Seed = PHRandomSeed();
0056
0057 gsl_rng_set(m_RandomGenerator, m_Seed);
0058 }
0059
0060 RawTowerDigitizer::~RawTowerDigitizer()
0061 {
0062 gsl_rng_free(m_RandomGenerator);
0063 delete m_CDBTTree;
0064 }
0065
0066 void RawTowerDigitizer::set_seed(const unsigned int iseed)
0067 {
0068 m_Seed = iseed;
0069 gsl_rng_set(m_RandomGenerator, m_Seed);
0070 }
0071
0072 int RawTowerDigitizer::InitRun(PHCompositeNode *topNode)
0073 {
0074 PHNodeIterator iter(topNode);
0075
0076
0077 PHCompositeNode *dstNode;
0078 dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0079 if (!dstNode)
0080 {
0081 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0082 << "DST Node missing, doing nothing." << std::endl;
0083 exit(1);
0084 }
0085
0086 try
0087 {
0088 CreateNodes(topNode);
0089 }
0090 catch (std::exception &e)
0091 {
0092 std::cout << e.what() << std::endl;
0093 return Fun4AllReturnCodes::ABORTRUN;
0094 }
0095
0096 if (m_DoDecal)
0097 {
0098 if (m_Detector.c_str()[0] == 'H')
0099 {
0100 std::string url = CDBInterface::instance()->getUrl("HCALGAINSCORR");
0101 if (url.empty())
0102 {
0103 std::cout << PHWHERE << " Could not get Hcal Calibration for domain HCALGAINSCORR" << std::endl;
0104 gSystem->Exit(1);
0105 exit(1);
0106 }
0107
0108 m_CDBTTree = new CDBTTree(url);
0109 }
0110 else if (m_Detector.c_str()[0] == 'C')
0111 {
0112 std::string url = CDBInterface::instance()->getUrl("CEMCGAINSCORR");
0113 if (url.empty())
0114 {
0115 std::cout << PHWHERE << " Could not get Cemc Calibration for domain CEMCGAINSCORR" << std::endl;
0116 gSystem->Exit(1);
0117 exit(1);
0118 }
0119
0120 m_CDBTTree = new CDBTTree(url);
0121 }
0122 else
0123 {
0124 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0125 << "Calo Decal requested but Detector Name not HCALOUT/IN or CEMC"
0126 << std::endl;
0127 gSystem->Exit(1);
0128 }
0129
0130 }
0131
0132 return Fun4AllReturnCodes::EVENT_OK;
0133 }
0134
0135 int RawTowerDigitizer::process_event(PHCompositeNode * )
0136 {
0137 if (Verbosity())
0138 {
0139 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0140 << "Process event entered. "
0141 << "Digitalization method: ";
0142
0143 if (m_DigiAlgorithm == kNo_digitization)
0144 {
0145 std::cout << "directly pass the energy of sim tower to digitalized tower";
0146 }
0147 else if (m_DigiAlgorithm == kSimple_photon_digitization)
0148 {
0149 std::cout << "simple digitization with photon statistics, ADC conversion and pedstal";
0150 }
0151 std::cout << std::endl;
0152 }
0153
0154
0155 RawTowerGeomContainer::ConstRange all_towers = m_RawTowerGeom->get_tower_geometries();
0156
0157 double deadChanEnergy = 0;
0158
0159 for (RawTowerGeomContainer::ConstIterator it = all_towers.first;
0160 it != all_towers.second; ++it)
0161 {
0162 const RawTowerDefs::keytype key = it->second->get_id();
0163 RawTowerDefs::CalorimeterId caloid = RawTowerDefs::decode_caloid(key);
0164 const int eta = it->second->get_bineta();
0165 const int phi = it->second->get_binphi();
0166
0167 if (caloid == RawTowerDefs::LFHCAL)
0168 {
0169 const int l = it->second->get_binl();
0170 if (m_ZeroSuppressionFile == true)
0171 {
0172 const std::string zsName = "ZS_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi) + "_l" + std::to_string(l);
0173 m_ZeroSuppressionADC =
0174 _tower_params.get_double_param(zsName);
0175 }
0176
0177 if (m_pedestalFile == true)
0178 {
0179 const std::string pedCentralName = "PedCentral_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi) + "_l" + std::to_string(l);
0180 m_PedstalCentralADC =
0181 _tower_params.get_double_param(pedCentralName);
0182 const std::string pedWidthName = "PedWidth_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi) + "_l" + std::to_string(l);
0183 m_PedstalWidthADC =
0184 _tower_params.get_double_param(pedWidthName);
0185 }
0186 }
0187 else
0188 {
0189 if (m_ZeroSuppressionFile == true)
0190 {
0191 const std::string zsName = "ZS_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi);
0192 m_ZeroSuppressionADC = _tower_params.get_double_param(zsName);
0193 }
0194
0195 if (m_pedestalFile == true)
0196 {
0197 const std::string pedCentralName = "PedCentral_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi);
0198 m_PedstalCentralADC = _tower_params.get_double_param(pedCentralName);
0199 const std::string pedWidthName = "PedWidth_ADC_eta" + std::to_string(eta) + "_phi" + std::to_string(phi);
0200 m_PedstalWidthADC = _tower_params.get_double_param(pedWidthName);
0201 }
0202 }
0203
0204 if (m_TowerType >= 0)
0205 {
0206
0207 if (m_TowerType != it->second->get_tower_type())
0208 {
0209 continue;
0210 }
0211 }
0212
0213 RawTower *digi_tower = nullptr;
0214 TowerInfo *digi_towerinfo = nullptr;
0215
0216 if (m_UseTowerInfo != 1)
0217 {
0218 RawTower *sim_tower = m_SimTowers->getTower(key);
0219 if (m_DeadMap)
0220 {
0221 if (m_DeadMap->isDeadTower(key))
0222 {
0223 if (sim_tower)
0224 {
0225 deadChanEnergy += sim_tower->get_energy();
0226 }
0227
0228 sim_tower = nullptr;
0229
0230 if (Verbosity() >= VERBOSITY_MORE)
0231 {
0232 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0233 << " apply dead tower " << key << std::endl;
0234 }
0235 }
0236 }
0237 if (m_DigiAlgorithm == kNo_digitization)
0238 {
0239
0240 if (sim_tower)
0241 {
0242 digi_tower = new RawTowerv2(*sim_tower);
0243 }
0244 }
0245 else if (m_DigiAlgorithm == kSimple_photon_digitization)
0246 {
0247
0248 digi_tower = simple_photon_digitization(sim_tower);
0249 }
0250 else if (m_DigiAlgorithm == kSiPM_photon_digitization)
0251 {
0252
0253 digi_tower = sipm_photon_digitization(sim_tower);
0254 }
0255 else
0256 {
0257 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0258 << " invalid digitization algorithm #" << m_DigiAlgorithm
0259 << std::endl;
0260
0261 return Fun4AllReturnCodes::ABORTRUN;
0262 }
0263
0264 if (digi_tower)
0265 {
0266 if (m_DoDecal && m_Decal)
0267 {
0268 unsigned int etaphikey = phi;
0269 etaphikey = (etaphikey << 16U) + eta;
0270 float decal_fctr = m_CDBTTree->GetFloatValue(etaphikey, "etaphi");
0271
0272 if (m_DecalInverse)
0273 {
0274 decal_fctr = 1.0 / decal_fctr;
0275 }
0276 float e_dec = digi_tower->get_energy();
0277 digi_tower->set_energy(e_dec * decal_fctr);
0278 }
0279 m_RawTowers->AddTower(key, digi_tower);
0280 if (Verbosity() >= VERBOSITY_MORE)
0281 {
0282 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0283 << " output tower:"
0284 << std::endl;
0285 digi_tower->identify();
0286 }
0287 }
0288 }
0289
0290 if (m_UseTowerInfo > 0)
0291 {
0292 unsigned int towerkey = ((unsigned int) (eta) << 16U) + phi;
0293
0294 TowerInfo *sim_tower = m_SimTowerInfos->get_tower_at_key(towerkey);
0295 if (m_DeadMap)
0296 {
0297 if (m_DeadMap->isDeadTower(key))
0298 {
0299 if (sim_tower)
0300 {
0301 deadChanEnergy += sim_tower->get_energy();
0302 }
0303 sim_tower = nullptr;
0304 if (Verbosity() >= VERBOSITY_MORE)
0305 {
0306 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0307 << " apply dead tower " << key << std::endl;
0308 }
0309 }
0310 }
0311 if (m_DigiAlgorithm == kNo_digitization)
0312 {
0313
0314 if (sim_tower)
0315 {
0316 digi_towerinfo = new TowerInfov1(*sim_tower);
0317 }
0318 }
0319 else if (m_DigiAlgorithm == kSimple_photon_digitization)
0320 {
0321
0322 digi_towerinfo = simple_photon_digitization(sim_tower);
0323 }
0324 else if (m_DigiAlgorithm == kSiPM_photon_digitization)
0325 {
0326
0327 digi_towerinfo = sipm_photon_digitization(sim_tower);
0328 }
0329 else
0330 {
0331 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0332 << " invalid digitization algorithm #" << m_DigiAlgorithm
0333 << std::endl;
0334
0335 return Fun4AllReturnCodes::ABORTRUN;
0336 }
0337
0338 if (digi_towerinfo)
0339 {
0340 if (m_DoDecal && m_Decal)
0341 {
0342 unsigned int etaphikey = phi;
0343 etaphikey = (etaphikey << 16U) + eta;
0344 float decal_fctr = m_CDBTTree->GetFloatValue(etaphikey, "etaphi");
0345 if (m_DecalInverse)
0346 {
0347 decal_fctr = 1.0 / decal_fctr;
0348 }
0349 float e_dec = digi_towerinfo->get_energy();
0350 digi_towerinfo->set_energy(e_dec * decal_fctr);
0351 }
0352 TowerInfo *digitized_towerinfo = m_RawTowerInfos->get_tower_at_key(towerkey);
0353 if (m_UseTowerInfo == 2)
0354 {
0355 if (digi_tower)
0356 {
0357 digitized_towerinfo->set_energy(digi_tower->get_energy());
0358 }
0359 else
0360 {
0361 digitized_towerinfo->set_energy(0);
0362 }
0363 }
0364 else
0365 {
0366 digitized_towerinfo->set_energy(digi_towerinfo->get_energy());
0367 }
0368 }
0369 delete digi_towerinfo;
0370 }
0371 }
0372
0373 if (Verbosity())
0374 {
0375 if (m_UseTowerInfo != 1)
0376 {
0377 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0378 << "input sum energy = " << m_SimTowers->getTotalEdep() << " GeV"
0379 << ", dead channel masked energy = " << deadChanEnergy << " GeV"
0380 << ", output sum digitalized value = " << m_RawTowers->getTotalEdep() << " ADC"
0381 << std::endl;
0382 }
0383 }
0384 return Fun4AllReturnCodes::EVENT_OK;
0385 }
0386
0387 RawTower *
0388 RawTowerDigitizer::simple_photon_digitization(RawTower *sim_tower)
0389 {
0390 RawTower *digi_tower = nullptr;
0391
0392 double energy = 0.;
0393 if (sim_tower)
0394 {
0395 energy = sim_tower->get_energy();
0396 }
0397 const double photon_count_mean = energy * m_PhotonElecYieldVisibleGeV;
0398 const int photon_count = gsl_ran_poisson(m_RandomGenerator, photon_count_mean);
0399
0400 const int signal_ADC = floor(photon_count / m_PhotonElecADC);
0401 const double pedestal = m_PedstalCentralADC + ((m_PedstalWidthADC > 0) ? gsl_ran_gaussian(m_RandomGenerator, m_PedstalWidthADC) : 0);
0402
0403 const int sum_ADC = signal_ADC + (int) pedestal;
0404
0405 double sum_ADC_d = (double) sum_ADC;
0406
0407
0408
0409
0410
0411 if (m_DoDecal)
0412 {
0413 double signal_ADC_d = 1. * photon_count;
0414 signal_ADC_d /= m_PhotonElecADC;
0415
0416 sum_ADC_d = signal_ADC_d + pedestal;
0417 }
0418
0419 if (sum_ADC > m_ZeroSuppressionADC)
0420 {
0421
0422 if (sim_tower)
0423 {
0424 digi_tower = new RawTowerv2(*sim_tower);
0425 }
0426 else
0427 {
0428 digi_tower = new RawTowerv2();
0429 }
0430 digi_tower->set_energy(sum_ADC_d);
0431 }
0432
0433 if (Verbosity() >= 2)
0434 {
0435 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0436 << std::endl;
0437
0438 std::cout << "input: ";
0439 if (sim_tower)
0440 {
0441 sim_tower->identify();
0442 }
0443 else
0444 {
0445 std::cout << "None" << std::endl;
0446 }
0447 std::cout << "output based on "
0448 << "sum_ADC = " << sum_ADC << ", zero_sup = "
0449 << m_ZeroSuppressionADC << " : ";
0450 if (digi_tower)
0451 {
0452 digi_tower->identify();
0453 }
0454 else
0455 {
0456 std::cout << "None" << std::endl;
0457 }
0458 }
0459 return digi_tower;
0460 }
0461
0462 TowerInfo *
0463 RawTowerDigitizer::simple_photon_digitization(TowerInfo *sim_tower)
0464 {
0465 TowerInfo *digi_tower = nullptr;
0466 if (sim_tower)
0467 {
0468 digi_tower = new TowerInfov1(*sim_tower);
0469 }
0470 else
0471 {
0472 digi_tower = new TowerInfov1();
0473 }
0474 double energy = 0.;
0475 if (sim_tower)
0476 {
0477 energy = sim_tower->get_energy();
0478 }
0479 const double photon_count_mean = energy * m_PhotonElecYieldVisibleGeV;
0480 const int photon_count = gsl_ran_poisson(m_RandomGenerator, photon_count_mean);
0481
0482 const int signal_ADC = floor(photon_count / m_PhotonElecADC);
0483 const double pedestal = m_PedstalCentralADC + ((m_PedstalWidthADC > 0) ? gsl_ran_gaussian(m_RandomGenerator, m_PedstalWidthADC) : 0);
0484
0485 const int sum_ADC = signal_ADC + (int) pedestal;
0486
0487 double sum_ADC_d = (double) sum_ADC;
0488
0489
0490
0491
0492
0493 if (m_DoDecal)
0494 {
0495 double signal_ADC_d = 1. * photon_count;
0496 signal_ADC_d /= m_PhotonElecADC;
0497
0498 sum_ADC_d = signal_ADC_d + pedestal;
0499 }
0500
0501 if (sum_ADC > m_ZeroSuppressionADC)
0502 {
0503 digi_tower->set_energy(sum_ADC_d);
0504 }
0505
0506 if (Verbosity() >= 2)
0507 {
0508 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0509 << std::endl;
0510
0511 std::cout << "input: ";
0512 if (sim_tower)
0513 {
0514 sim_tower->identify();
0515 }
0516 else
0517 {
0518 std::cout << "None" << std::endl;
0519 }
0520 std::cout << "output based on "
0521 << "sum_ADC = " << sum_ADC << ", zero_sup = "
0522 << m_ZeroSuppressionADC << " : ";
0523 if (digi_tower)
0524 {
0525 digi_tower->identify();
0526 }
0527 else
0528 {
0529 std::cout << "None" << std::endl;
0530 }
0531 }
0532 return digi_tower;
0533 }
0534
0535 RawTower *
0536 RawTowerDigitizer::sipm_photon_digitization(RawTower *sim_tower)
0537 {
0538 RawTower *digi_tower = nullptr;
0539
0540 double energy = 0;
0541 if (sim_tower)
0542 {
0543 energy = sim_tower->get_energy();
0544 }
0545
0546 int signal_ADC = 0;
0547
0548 if (energy > 0)
0549 {
0550 const double photon_count_mean = energy * m_PhotonElecYieldVisibleGeV;
0551 const double poission_param_per_pixel = photon_count_mean / m_SiPMEffectivePixel;
0552 const double prob_activated_per_pixel = gsl_cdf_poisson_Q(0, poission_param_per_pixel);
0553 const double active_pixel = gsl_ran_binomial(m_RandomGenerator, prob_activated_per_pixel, m_SiPMEffectivePixel);
0554 signal_ADC = floor(active_pixel / m_PhotonElecADC);
0555 }
0556
0557 const double pedstal = m_PedstalCentralADC + ((m_PedstalWidthADC > 0) ? gsl_ran_gaussian(m_RandomGenerator, m_PedstalWidthADC) : 0);
0558 const int sum_ADC = signal_ADC + (int) pedstal;
0559
0560 if (sum_ADC > m_ZeroSuppressionADC)
0561 {
0562
0563 if (sim_tower)
0564 {
0565 digi_tower = new RawTowerv2(*sim_tower);
0566 }
0567 else
0568 {
0569 digi_tower = new RawTowerv2();
0570 }
0571 digi_tower->set_energy((double) sum_ADC);
0572 }
0573
0574 if (Verbosity() >= 2)
0575 {
0576 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0577 << std::endl;
0578
0579 std::cout << "input: ";
0580 if (sim_tower)
0581 {
0582 sim_tower->identify();
0583 }
0584 else
0585 {
0586 std::cout << "None" << std::endl;
0587 }
0588 std::cout << "output based on "
0589 << "sum_ADC = " << sum_ADC << ", zero_sup = "
0590 << m_ZeroSuppressionADC << " : ";
0591 if (digi_tower)
0592 {
0593 digi_tower->identify();
0594 }
0595 else
0596 {
0597 std::cout << "None" << std::endl;
0598 }
0599 }
0600
0601 return digi_tower;
0602 }
0603
0604 TowerInfo *
0605 RawTowerDigitizer::sipm_photon_digitization(TowerInfo *sim_tower)
0606 {
0607 TowerInfo *digi_tower = nullptr;
0608
0609 double energy = 0;
0610 if (sim_tower)
0611 {
0612 energy = sim_tower->get_energy();
0613 }
0614
0615 int signal_ADC = 0;
0616
0617 if (energy > 0)
0618 {
0619 const double photon_count_mean = energy * m_PhotonElecYieldVisibleGeV;
0620 const double poission_param_per_pixel = photon_count_mean / m_SiPMEffectivePixel;
0621 const double prob_activated_per_pixel = gsl_cdf_poisson_Q(0, poission_param_per_pixel);
0622 const double active_pixel = gsl_ran_binomial(m_RandomGenerator, prob_activated_per_pixel, m_SiPMEffectivePixel);
0623 signal_ADC = floor(active_pixel / m_PhotonElecADC);
0624 }
0625
0626 const double pedstal = m_PedstalCentralADC + ((m_PedstalWidthADC > 0) ? gsl_ran_gaussian(m_RandomGenerator, m_PedstalWidthADC) : 0);
0627 const int sum_ADC = signal_ADC + (int) pedstal;
0628
0629 if (sum_ADC > m_ZeroSuppressionADC)
0630 {
0631
0632 if (sim_tower)
0633 {
0634 digi_tower = new TowerInfov1(*sim_tower);
0635 }
0636 else
0637 {
0638 digi_tower = new TowerInfov1();
0639 }
0640 digi_tower->set_energy((double) sum_ADC);
0641 }
0642
0643 if (Verbosity() >= 2)
0644 {
0645 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0646 << std::endl;
0647
0648 std::cout << "input: ";
0649 if (sim_tower)
0650 {
0651 sim_tower->identify();
0652 }
0653 else
0654 {
0655 std::cout << "None" << std::endl;
0656 }
0657 std::cout << "output based on "
0658 << "sum_ADC = " << sum_ADC << ", zero_sup = "
0659 << m_ZeroSuppressionADC << " : ";
0660 if (digi_tower)
0661 {
0662 digi_tower->identify();
0663 }
0664 else
0665 {
0666 std::cout << "None" << std::endl;
0667 }
0668 }
0669 return digi_tower;
0670 }
0671
0672 void RawTowerDigitizer::CreateNodes(PHCompositeNode *topNode)
0673 {
0674 PHNodeIterator iter(topNode);
0675 PHCompositeNode *runNode = static_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0676 if (!runNode)
0677 {
0678 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0679 << "Run Node missing, doing nothing." << std::endl;
0680 throw std::runtime_error("Failed to find Run node in RawTowerDigitizer::CreateNodes");
0681 }
0682
0683 std::string TowerGeomNodeName = "TOWERGEOM_" + m_Detector;
0684 m_RawTowerGeom = findNode::getClass<RawTowerGeomContainer>(topNode, TowerGeomNodeName);
0685 if (!m_RawTowerGeom)
0686 {
0687 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0688 << " " << TowerGeomNodeName << " Node missing, doing bail out!"
0689 << std::endl;
0690 throw std::runtime_error("Failed to find " + TowerGeomNodeName + " node in RawTowerDigitizer::CreateNodes");
0691 }
0692
0693 if (Verbosity() >= 1)
0694 {
0695 m_RawTowerGeom->identify();
0696 }
0697
0698 const std::string deadMapName = "DEADMAP_" + m_Detector;
0699 m_DeadMap = findNode::getClass<RawTowerDeadMap>(topNode, deadMapName);
0700 if (m_DeadMap)
0701 {
0702 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0703 << " use dead map: ";
0704 m_DeadMap->identify();
0705 }
0706
0707 PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0708 if (!dstNode)
0709 {
0710 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0711 << "DST Node missing, doing nothing." << std::endl;
0712 throw std::runtime_error("Failed to find DST node in RawTowerDigitizer::CreateNodes");
0713 }
0714
0715 if (m_UseTowerInfo != 1)
0716 {
0717 std::string SimTowerNodeName = "TOWER_" + m_SimTowerNodePrefix + "_" + m_Detector;
0718 m_SimTowers = findNode::getClass<RawTowerContainer>(dstNode, SimTowerNodeName);
0719 if (!m_SimTowers)
0720 {
0721 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0722 << " " << SimTowerNodeName << " Node missing, doing bail out!"
0723 << std::endl;
0724 throw std::runtime_error("Failed to find " + SimTowerNodeName + " node in RawTowerDigitizer::CreateNodes");
0725 }
0726 }
0727 if (m_UseTowerInfo > 0)
0728 {
0729 std::string SimTowerInfoNodeName = "TOWERINFO_" + m_SimTowerNodePrefix + "_" + m_Detector;
0730 m_SimTowerInfos = findNode::getClass<TowerInfoContainer>(dstNode, SimTowerInfoNodeName);
0731 if (!m_SimTowerInfos)
0732 {
0733 std::cout << Name() << "::" << m_Detector << "::" << __PRETTY_FUNCTION__
0734 << " " << SimTowerInfoNodeName << " Node missing, doing bail out!"
0735 << std::endl;
0736 throw std::runtime_error("Failed to find " + SimTowerInfoNodeName + " node in RawTowerDigitizer::CreateNodes");
0737 }
0738 }
0739
0740
0741 PHNodeIterator dstiter(dstNode);
0742 PHCompositeNode *DetNode = dynamic_cast<PHCompositeNode *>(dstiter.findFirst("PHCompositeNode", m_Detector));
0743 if (!DetNode)
0744 {
0745 DetNode = new PHCompositeNode(m_Detector);
0746 dstNode->addNode(DetNode);
0747 }
0748
0749
0750
0751 if (m_UseTowerInfo != 1)
0752 {
0753 std::string RawTowerNodeName = "TOWER_" + m_RawTowerNodePrefix + "_" + m_Detector;
0754 m_RawTowers = findNode::getClass<RawTowerContainer>(DetNode, RawTowerNodeName);
0755 if (!m_RawTowers)
0756 {
0757 m_RawTowers = new RawTowerContainer(m_SimTowers->getCalorimeterID());
0758 PHIODataNode<PHObject> *towerNode = new PHIODataNode<PHObject>(m_RawTowers,
0759 RawTowerNodeName, "PHObject");
0760 DetNode->addNode(towerNode);
0761 }
0762 }
0763 if (m_UseTowerInfo > 0)
0764 {
0765 std::string TowerInfoNodeName = "TOWERINFO_" + m_RawTowerNodePrefix + "_" + m_Detector;
0766 m_RawTowerInfos = findNode::getClass<TowerInfoContainer>(DetNode, TowerInfoNodeName);
0767 if (m_RawTowerInfos == nullptr)
0768 {
0769 TowerInfoContainer::DETECTOR detec;
0770 if (m_Detector == "CEMC")
0771 {
0772 detec = TowerInfoContainer::DETECTOR::EMCAL;
0773 }
0774 else if (m_Detector == "HCALIN" || m_Detector == "HCALOUT")
0775 {
0776 detec = TowerInfoContainer::DETECTOR::HCAL;
0777 }
0778 else
0779 {
0780 std::cout << PHWHERE << "Detector not implemented into the TowerInfoContainer object, defaulting to HCal implementation." << std::endl;
0781 detec = TowerInfoContainer::DETECTOR::HCAL;
0782 }
0783 m_RawTowerInfos = new TowerInfoContainerv1(detec);
0784 PHIODataNode<PHObject> *towerinfoNode = new PHIODataNode<PHObject>(m_RawTowerInfos, TowerInfoNodeName, "PHObject");
0785 DetNode->addNode(towerinfoNode);
0786 }
0787 }
0788
0789 return;
0790 }