File indexing completed on 2025-12-17 09:20:01
0001 #include "caloTreeGen.h"
0002
0003
0004 #include <calobase/RawCluster.h>
0005 #include <calobase/RawClusterContainer.h>
0006 #include <calobase/RawClusterUtility.h>
0007 #include <calobase/RawTowerDefs.h>
0008
0009
0010 #include <calobase/TowerInfo.h>
0011 #include <calobase/TowerInfoContainer.h>
0012 #include <calobase/TowerInfoDefs.h>
0013
0014
0015 #include <globalvertex/GlobalVertex.h>
0016 #include <globalvertex/GlobalVertexMap.h>
0017
0018
0019 #include <ffarawobjects/Gl1Packet.h>
0020
0021 #include <fun4all/Fun4AllReturnCodes.h>
0022 #include <fun4all/Fun4AllServer.h>
0023
0024 #include <phool/getClass.h>
0025 #include <phool/phool.h>
0026
0027
0028 #include <TFile.h>
0029 #include <TH1.h>
0030 #include <TTree.h>
0031
0032
0033 #include <CLHEP/Vector/ThreeVector.h>
0034
0035 #include <algorithm>
0036 #include <cstdint>
0037 #include <iostream>
0038 #include <map>
0039 #include <utility>
0040
0041
0042 caloTreeGen::caloTreeGen(const std::string &name)
0043 : SubsysReco("CaloTreeGen")
0044 , Outfile(name)
0045 {
0046 std::cout << "caloTreeGen::caloTreeGen(const std::string &name) Calling ctor" << std::endl;
0047 }
0048
0049
0050 int caloTreeGen::Init(PHCompositeNode * )
0051 {
0052 delete out;
0053 out = new TFile(Outfile.c_str(), "RECREATE");
0054
0055 T = new TTree("T", "T");
0056
0057
0058 if (storeEMCal)
0059 {
0060 T->Branch("emcTowE", &m_emcTowE);
0061 T->Branch("emcTowiEta", &m_emciEta);
0062 T->Branch("emcTowiPhi", &m_emciPhi);
0063 T->Branch("emcTime", &m_emcTime);
0064 T->Branch("emcChi2", &m_emcChi2);
0065 T->Branch("emcPed", &m_emcPed);
0066
0067
0068 if (storeEMCal && storeClusters)
0069 {
0070 T->Branch("clusterE", &m_clusterE);
0071 T->Branch("clusterPhi", &m_clusterPhi);
0072 T->Branch("clusterEta", &m_clusterEta);
0073 T->Branch("clusterPt", &m_clusterPt);
0074 T->Branch("clusterChi2", &m_clusterChi);
0075 T->Branch("clusterNtow", &m_clusterNtow);
0076 T->Branch("clusterTowMaxE", &m_clusterTowMaxE);
0077 T->Branch("clusterECore", &m_clusterECore);
0078
0079
0080
0081 if (storeEMCal && storeClusters && storeClusterDetails)
0082 {
0083 T->Branch("clusTowPhi", "vector<vector<int> >", &m_clusTowPhi);
0084 T->Branch("clusTowEta", "vector<vector<int> >", &m_clusTowEta);
0085 T->Branch("clusTowE", "vector<vector<float> >", &m_clusTowE);
0086 }
0087 }
0088 }
0089
0090 if (storeHCals)
0091 {
0092 T->Branch("ohcTowE", &m_ohcTowE);
0093 T->Branch("ohcTowiEta", &m_ohciTowEta);
0094 T->Branch("ohcTowiPhi", &m_ohciTowPhi);
0095 T->Branch("ohcTime", &m_ohcTime);
0096 T->Branch("ohcChi2", &m_ohcChi2);
0097 T->Branch("ohcPed", &m_ohcPed);
0098
0099
0100 T->Branch("ihcTowE", &m_ihcTowE);
0101 T->Branch("ihcTowiEta", &m_ihciTowEta);
0102 T->Branch("ihcTowiPhi", &m_ihciTowPhi);
0103 T->Branch("ihcTime", &m_ihcTime);
0104 T->Branch("ihcChi2", &m_ihcChi2);
0105 T->Branch("ihcPed", &m_ihcPed);
0106 }
0107
0108 if (storeZDC)
0109 {
0110 T->Branch("zdcTowE", &m_zdcTowE);
0111 T->Branch("zdcTowside", &m_zdcSide);
0112
0113
0114 T->Branch("smdE", &m_smdE);
0115 T->Branch("smdSide", &m_smdSide);
0116 }
0117
0118 T->Branch("totalCaloEEMCal", &totalCaloEEMCal);
0119 T->Branch("totalCaloEOHCal", &totalCaloEOHCal);
0120 T->Branch("totalCaloEIHCal", &totalCaloEIHCal);
0121 T->Branch("totalCaloEZDC", &totalCaloEZDC);
0122 T->Branch("zvertex", &m_vertex);
0123
0124
0125 if (storeTrig)
0126 {
0127 T->Branch("triggerVector", &m_triggerVector);
0128 }
0129
0130 zVertex = new TH1F("zVertex", "zVertex", 200, -100, 100);
0131
0132
0133 Fun4AllServer *se = Fun4AllServer::instance();
0134 se->Print("NODETREE");
0135
0136 std::cout << "caloTreeGen::Init(PHCompositeNode *topNode) Initializing" << std::endl;
0137 return Fun4AllReturnCodes::EVENT_OK;
0138 }
0139
0140
0141 int caloTreeGen::process_event(PHCompositeNode *topNode)
0142 {
0143
0144 if(eventNum >= 100)
0145 {
0146 return Fun4AllReturnCodes::EVENT_OK;
0147 }
0148
0149 m_vertex = -9999;
0150 GlobalVertexMap *vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
0151 if (!vertexmap)
0152 {
0153 std::cout << "GlobalVertexMap node is missing" << std::endl;
0154 }
0155 if (vertexmap && !vertexmap->empty())
0156 {
0157 GlobalVertex *vtx = vertexmap->begin()->second;
0158 if (vtx)
0159 {
0160 m_vertex = vtx->get_z();
0161 zVertex->Fill(m_vertex);
0162 }
0163 }
0164
0165
0166 RawClusterContainer *clusterContainer = findNode::getClass<RawClusterContainer>(topNode, m_clusterNode);
0167 if (!clusterContainer && storeClusters)
0168 {
0169 std::cout << PHWHERE << "caloTreeGen::process_event: " << m_clusterNode << " node is missing. Output related to this node will be empty" << std::endl;
0170 return 0;
0171 }
0172
0173
0174 TowerInfoContainer *emcTowerContainer;
0175 emcTowerContainer = findNode::getClass<TowerInfoContainer>(topNode, m_emcTowerNode);
0176 if (!emcTowerContainer && storeEMCal)
0177 {
0178 std::cout << PHWHERE << "caloTreeGen::process_event: " << m_emcTowerNode << " node is missing. Output related to this node will be empty" << std::endl;
0179 }
0180
0181
0182 unsigned int tower_range = 0;
0183 if (storeEMCal && emcTowerContainer)
0184 {
0185 tower_range = emcTowerContainer->size();
0186 totalCaloEEMCal = 0;
0187 for (unsigned int iter = 0; iter < tower_range; iter++)
0188 {
0189 unsigned int towerkey = emcTowerContainer->encode_key(iter);
0190 unsigned int ieta = TowerInfoDefs::getCaloTowerEtaBin(towerkey);
0191 unsigned int iphi = TowerInfoDefs::getCaloTowerPhiBin(towerkey);
0192 double energy = emcTowerContainer->get_tower_at_channel(iter)->get_energy();
0193 if (energy < emcalThresh)
0194 {
0195 continue;
0196 }
0197 int time = emcTowerContainer->get_tower_at_channel(iter)->get_time();
0198 float chi2 = emcTowerContainer->get_tower_at_channel(iter)->get_chi2();
0199 float pedestal = emcTowerContainer->get_tower_at_channel(iter)->get_pedestal();
0200 totalCaloEEMCal += energy;
0201 m_emciPhi.push_back(iphi);
0202 m_emciEta.push_back(ieta);
0203 m_emcTowE.push_back(energy);
0204 m_emcTime.push_back(time);
0205 m_emcChi2.push_back(chi2);
0206 m_emcPed.push_back(pedestal);
0207 }
0208 }
0209
0210 if (storeClusters && storeEMCal)
0211 {
0212 RawClusterContainer::ConstRange clusterEnd = clusterContainer->getClusters();
0213 RawClusterContainer::ConstIterator clusterIter;
0214 for (clusterIter = clusterEnd.first; clusterIter != clusterEnd.second; clusterIter++)
0215 {
0216 RawCluster *recoCluster = clusterIter->second;
0217
0218 CLHEP::Hep3Vector vertex(0, 0, 0);
0219 if (m_vertex != -9999)
0220 {
0221 vertex.setZ(m_vertex);
0222 }
0223 CLHEP::Hep3Vector E_vec_cluster = RawClusterUtility::GetECoreVec(*recoCluster, vertex);
0224 CLHEP::Hep3Vector E_vec_cluster_Full = RawClusterUtility::GetEVec(*recoCluster, vertex);
0225
0226 float clusE = E_vec_cluster_Full.mag();
0227 if (clusE < clusterThresh)
0228 {
0229 continue;
0230 }
0231
0232 float clusEcore = E_vec_cluster.mag();
0233 float clus_eta = E_vec_cluster.pseudoRapidity();
0234 float clus_phi = E_vec_cluster.phi();
0235 float clus_pt = E_vec_cluster.perp();
0236 float clus_chi = recoCluster->get_chi2();
0237 float nTowers = recoCluster->getNTowers();
0238 float maxTowerEnergy = getMaxTowerE(recoCluster);
0239
0240 m_clusterE.push_back(clusE);
0241 m_clusterECore.push_back(clusEcore);
0242 m_clusterPhi.push_back(clus_phi);
0243 m_clusterEta.push_back(clus_eta);
0244 m_clusterPt.push_back(clus_pt);
0245 m_clusterChi.push_back(clus_chi);
0246 m_clusterNtow.push_back(nTowers);
0247 m_clusterTowMaxE.push_back(maxTowerEnergy);
0248 if (storeClusterDetails)
0249 {
0250 m_clusTowPhi.push_back(returnClusterTowPhi(recoCluster));
0251 m_clusTowEta.push_back(returnClusterTowEta(recoCluster));
0252 m_clusTowE.push_back(returnClusterTowE(recoCluster));
0253 }
0254 }
0255 }
0256
0257
0258 TowerInfoContainer *ohcTowerContainer = findNode::getClass<TowerInfoContainer>(topNode, m_ohcTowerNode);
0259 TowerInfoContainer *ihcTowerContainer = findNode::getClass<TowerInfoContainer>(topNode, m_ihcTowerNode);
0260
0261 if (!ohcTowerContainer || !ihcTowerContainer)
0262 {
0263 std::cout << PHWHERE << "caloTreeGen::process_event: " << m_ohcTowerNode << " or " << m_ohcTowerNode << " node is missing. Output related to this node will be empty" << std::endl;
0264 return Fun4AllReturnCodes::ABORTEVENT;
0265 }
0266
0267 if (storeHCals && ohcTowerContainer && ihcTowerContainer)
0268 {
0269 tower_range = ohcTowerContainer->size();
0270 totalCaloEOHCal = 0;
0271 for (unsigned int iter = 0; iter < tower_range; iter++)
0272 {
0273 unsigned int towerkey = ohcTowerContainer->encode_key(iter);
0274 unsigned int ieta = TowerInfoDefs::getCaloTowerEtaBin(towerkey);
0275 unsigned int iphi = TowerInfoDefs::getCaloTowerPhiBin(towerkey);
0276 int time = ohcTowerContainer->get_tower_at_channel(iter)->get_time();
0277 float chi2 = ohcTowerContainer->get_tower_at_channel(iter)->get_chi2();
0278 double energy = ohcTowerContainer->get_tower_at_channel(iter)->get_energy();
0279 if (energy < ohcalThresh)
0280 {
0281 continue;
0282 }
0283 float pedestal = ohcTowerContainer->get_tower_at_channel(iter)->get_pedestal();
0284
0285 totalCaloEOHCal += energy;
0286 m_ohcTowE.push_back(energy);
0287 m_ohciTowEta.push_back(ieta);
0288 m_ohciTowPhi.push_back(iphi);
0289 m_ohcTime.push_back(time);
0290 m_ohcChi2.push_back(chi2);
0291 m_ohcPed.push_back(pedestal);
0292 }
0293
0294 tower_range = ihcTowerContainer->size();
0295 totalCaloEIHCal = 0;
0296 for (unsigned int iter = 0; iter < tower_range; iter++)
0297 {
0298 unsigned int towerkey = ihcTowerContainer->encode_key(iter);
0299 unsigned int ieta = TowerInfoDefs::getCaloTowerEtaBin(towerkey);
0300 unsigned int iphi = TowerInfoDefs::getCaloTowerPhiBin(towerkey);
0301 int time = ihcTowerContainer->get_tower_at_channel(iter)->get_time();
0302 float chi2 = ihcTowerContainer->get_tower_at_channel(iter)->get_chi2();
0303 double energy = ihcTowerContainer->get_tower_at_channel(iter)->get_energy();
0304 if (energy < ihcalThresh)
0305 {
0306 continue;
0307 }
0308 float pedestal = ihcTowerContainer->get_tower_at_channel(iter)->get_pedestal();
0309
0310 totalCaloEIHCal += energy;
0311 m_ihcTowE.push_back(energy);
0312 m_ihciTowEta.push_back(ieta);
0313 m_ihciTowPhi.push_back(iphi);
0314 m_ihcTime.push_back(time);
0315 m_ihcChi2.push_back(chi2);
0316 m_ihcPed.push_back(pedestal);
0317 }
0318 }
0319
0320 TowerInfoContainer *zdcTowerContainer = findNode::getClass<TowerInfoContainer>(topNode, m_zdcTowerNode);
0321 if (!zdcTowerContainer)
0322 {
0323 std::cout << PHWHERE << "caloTreeGen::process_event: " << m_emcTowerNode << " node is missing. Output related to this node will be empty" << std::endl;
0324 return Fun4AllReturnCodes::ABORTEVENT;
0325 }
0326
0327 if (storeZDC && zdcTowerContainer)
0328 {
0329 tower_range = zdcTowerContainer->size();
0330 totalCaloEZDC = 0;
0331 for (unsigned int iter = 0; iter < tower_range; iter++)
0332 {
0333 if (iter < 16)
0334 {
0335 float energy = zdcTowerContainer->get_tower_at_channel(iter)->get_energy();
0336 m_zdcTowE.push_back(energy);
0337 unsigned int towerkey = zdcTowerContainer->encode_key(iter);
0338 unsigned int side = TowerInfoDefs::get_zdc_side(towerkey);
0339 m_zdcSide.push_back(side);
0340 totalCaloEZDC += energy;
0341 }
0342 if (iter > 15 && iter < 48)
0343 {
0344
0345 float energy = zdcTowerContainer->get_tower_at_channel(iter)->get_energy();
0346 m_smdE.push_back(energy);
0347 unsigned int towerkey = zdcTowerContainer->encode_key(iter);
0348 unsigned int side = TowerInfoDefs::get_zdc_side(towerkey);
0349 m_smdSide.push_back(side);
0350 }
0351 }
0352 }
0353
0354 Gl1Packet *gl1PacketInfo = findNode::getClass<Gl1Packet>(topNode, m_trigNode);
0355 if (!gl1PacketInfo && storeTrig)
0356 {
0357 std::cout << PHWHERE << "caloTreeGen::process_event: " << m_trigNode << " node is missing. Output related to this node will be empty" << std::endl;
0358 }
0359
0360 if (storeTrig && gl1PacketInfo)
0361 {
0362 uint64_t triggervec = gl1PacketInfo->getScaledVector();
0363 for (int i = 0; i < 64; i++)
0364 {
0365 bool trig_decision = ((triggervec & 0x1U) == 0x1U);
0366 m_triggerVector.push_back(trig_decision);
0367 triggervec = (triggervec >> 1U) & 0xffffffffU;
0368 }
0369 }
0370 T->Fill();
0371 eventNum++;
0372
0373 return Fun4AllReturnCodes::EVENT_OK;
0374 }
0375
0376
0377 int caloTreeGen::ResetEvent(PHCompositeNode * )
0378 {
0379 m_clusterE.clear();
0380 m_clusterPhi.clear();
0381 m_clusterEta.clear();
0382 m_clusterPt.clear();
0383 m_clusterChi.clear();
0384 m_clusterTowMaxE.clear();
0385 m_clusterNtow.clear();
0386 m_clusterECore.clear();
0387
0388 m_emcTowE.clear();
0389 m_emciEta.clear();
0390 m_emciPhi.clear();
0391 m_emcTime.clear();
0392 m_emcChi2.clear();
0393 m_emcPed.clear();
0394
0395 m_ihcTowE.clear();
0396 m_ihciTowEta.clear();
0397 m_ihciTowPhi.clear();
0398 m_ihcTime.clear();
0399 m_ihcChi2.clear();
0400 m_ihcPed.clear();
0401
0402 m_ohcTowE.clear();
0403 m_ohciTowEta.clear();
0404 m_ohciTowPhi.clear();
0405 m_ohcTime.clear();
0406 m_ohcChi2.clear();
0407 m_ohcPed.clear();
0408
0409 m_clusTowPhi.clear();
0410 m_clusTowEta.clear();
0411 m_clusTowE.clear();
0412
0413 return Fun4AllReturnCodes::EVENT_OK;
0414 }
0415
0416
0417 int caloTreeGen::End(PHCompositeNode * )
0418 {
0419 std::cout << "caloTreeGen::End(PHCompositeNode *topNode) Saving TTree" << std::endl;
0420
0421 out->cd();
0422 T->Write();
0423 zVertex->Write();
0424 out->Close();
0425 delete out;
0426
0427 return Fun4AllReturnCodes::EVENT_OK;
0428 }
0429
0430
0431 float caloTreeGen::getMaxTowerE(RawCluster *cluster)
0432 {
0433 RawCluster::TowerConstRange towers = cluster->get_towers();
0434 RawCluster::TowerConstIterator toweriter;
0435
0436 float maxEnergy = 0;
0437 for (toweriter = towers.first; toweriter != towers.second; toweriter++)
0438 {
0439 float towE = toweriter->second;
0440
0441 maxEnergy = std::max(towE, maxEnergy);
0442 }
0443 return maxEnergy;
0444 }
0445
0446 std::vector<int> caloTreeGen::returnClusterTowEta(RawCluster *cluster)
0447 {
0448 RawCluster::TowerConstRange towers = cluster->get_towers();
0449 RawCluster::TowerConstIterator toweriter;
0450
0451 std::vector<int> towerIDsEta;
0452 for (toweriter = towers.first; toweriter != towers.second; toweriter++)
0453 {
0454 towerIDsEta.push_back(RawTowerDefs::decode_index1(toweriter->first));
0455 }
0456
0457 return towerIDsEta;
0458 }
0459
0460 std::vector<int> caloTreeGen::returnClusterTowPhi(RawCluster *cluster)
0461 {
0462 RawCluster::TowerConstRange towers = cluster->get_towers();
0463 RawCluster::TowerConstIterator toweriter;
0464
0465 std::vector<int> towerIDsPhi;
0466 for (toweriter = towers.first; toweriter != towers.second; toweriter++)
0467 {
0468 towerIDsPhi.push_back(RawTowerDefs::decode_index2(toweriter->first));
0469 }
0470 return towerIDsPhi;
0471 }
0472
0473 std::vector<float> caloTreeGen::returnClusterTowE(RawCluster *cluster)
0474 {
0475 RawCluster::TowerConstRange towers = cluster->get_towers();
0476 RawCluster::TowerConstIterator toweriter;
0477
0478 std::vector<float> towerE;
0479 for (toweriter = towers.first; toweriter != towers.second; toweriter++)
0480 {
0481 towerE.push_back(toweriter->second);
0482 }
0483
0484 return towerE;
0485 }