File indexing completed on 2025-12-18 09:20:29
0001 #include "G4TowerNtuple.h"
0002
0003 #include <calobase/RawTowerGeomContainer.h>
0004 #include <calobase/TowerInfo.h>
0005 #include <calobase/TowerInfoContainerv1.h>
0006
0007 #include <fun4all/Fun4AllHistoManager.h>
0008 #include <fun4all/SubsysReco.h> // for SubsysReco
0009
0010 #include <phool/getClass.h>
0011
0012 #include <TFile.h>
0013 #include <TH1.h>
0014 #include <TNtuple.h>
0015
0016 #include <cmath> // for isfinite
0017 #include <iostream> // for operator<<, basic_ostream
0018 #include <utility> // for pair, make_pair
0019
0020 G4TowerNtuple::G4TowerNtuple(const std::string &name, const std::string &filename)
0021 : SubsysReco(name)
0022 , m_filename(filename)
0023 {
0024 }
0025
0026 G4TowerNtuple::~G4TowerNtuple()
0027 {
0028 delete hm;
0029 }
0030
0031 int G4TowerNtuple::Init(PHCompositeNode * )
0032 {
0033 delete hm;
0034 hm = new Fun4AllHistoManager(Name());
0035 outfile = new TFile(m_filename.c_str(), "RECREATE");
0036 ntup = new TNtuple("towerntup", "G4Towers", "detid:phi:eta:energy");
0037
0038 TH1 *h1 = new TH1F("energy1GeV", "energy 0-1GeV", 1000, 0, 1);
0039 eloss.push_back(h1);
0040 h1 = new TH1F("energy100GeV", "energy 0-100GeV", 1000, 0, 100);
0041 eloss.push_back(h1);
0042 return 0;
0043 }
0044
0045 int G4TowerNtuple::process_event(PHCompositeNode *topNode)
0046 {
0047 std::string nodename;
0048 std::string geonodename;
0049 for (const auto &iter : m_node_postfix)
0050 {
0051 int detid = (m_detid.find(iter))->second;
0052 nodename = "TOWERINFO_" + m_tower_type[iter];
0053 geonodename = "TOWERGEOM_" + iter;
0054 RawTowerGeomContainer *towergeom = findNode::getClass<RawTowerGeomContainer>(topNode, geonodename);
0055 if (!towergeom)
0056 {
0057 std::cout << "no geometry node " << geonodename << " for " << iter << std::endl;
0058 continue;
0059 }
0060
0061 TowerInfoContainer *towers = findNode::getClass<TowerInfoContainer>(topNode, nodename);
0062 if (towers)
0063 {
0064 double esum = 0;
0065 unsigned int nchannels = towers->size();
0066 for (unsigned int channel = 0; channel < nchannels; channel++)
0067 {
0068 TowerInfo *tower = towers->get_tower_at_channel(channel);
0069 double energy = tower->get_energy();
0070 if (!std::isfinite(energy))
0071 {
0072 std::cout << "invalid energy: " << energy << std::endl;
0073 }
0074 esum += energy;
0075 unsigned int towerkey = towers->encode_key(channel);
0076 int etabin = towers->getTowerEtaBin(towerkey);
0077 int phibin = towers->getTowerPhiBin(towerkey);
0078
0079
0080 double phi = towergeom->get_phicenter(phibin);
0081 double eta = towergeom->get_etacenter(etabin);
0082 ntup->Fill(detid,
0083 phi,
0084 eta,
0085 energy);
0086 }
0087 for (auto *eiter : eloss)
0088 {
0089 eiter->Fill(esum);
0090 }
0091 }
0092 }
0093 return 0;
0094 }
0095
0096 int G4TowerNtuple::End(PHCompositeNode * )
0097 {
0098 outfile->cd();
0099 ntup->Write();
0100 outfile->Write();
0101 outfile->Close();
0102 delete outfile;
0103 hm->dumpHistos(m_filename, "UPDATE");
0104 return 0;
0105 }
0106
0107 void G4TowerNtuple::AddNode(const std::string &name, const std::string &twrtype, const int detid)
0108 {
0109 std::string twrname;
0110 twrname = twrtype + "_" + name;
0111 m_node_postfix.insert(name);
0112 m_tower_type.insert(make_pair(name, twrname));
0113 m_detid[name] = detid;
0114 return;
0115 }