File indexing completed on 2025-08-06 08:14:10
0001 #include "JESMCTreeGen.h"
0002
0003
0004 #include <globalvertex/GlobalVertex.h>
0005 #include <globalvertex/GlobalVertexMap.h>
0006
0007
0008 #include <calobase/TowerInfo.h>
0009 #include <calobase/TowerInfov1.h>
0010 #include <calobase/TowerInfov2.h>
0011 #include <calobase/TowerInfov3.h>
0012 #include <calobase/TowerInfoContainer.h>
0013 #include <calobase/TowerInfoContainerv1.h>
0014 #include <calobase/TowerInfoContainerv2.h>
0015 #include <calobase/TowerInfoContainerv3.h>
0016 #include <calobase/TowerInfoContainerv4.h>
0017 #include <calobase/TowerInfoDefs.h>
0018
0019
0020 #include <calobase/RawCluster.h>
0021 #include <calobase/RawClusterv1.h>
0022 #include <calobase/RawClusterContainer.h>
0023 #include <calobase/RawClusterUtility.h>
0024 #include <calobase/RawTowerDefs.h>
0025 #include <CLHEP/Vector/ThreeVector.h>
0026
0027
0028 #include <jetbase/Jetv1.h>
0029 #include <jetbase/Jetv2.h>
0030 #include <jetbase/JetContainer.h>
0031
0032
0033 #include <g4main/PHG4Particle.h>
0034 #include <g4main/PHG4TruthInfoContainer.h>
0035 #include <g4main/PHG4VtxPoint.h>
0036 #include <TDatabasePDG.h>
0037
0038
0039 #include <fun4all/Fun4AllReturnCodes.h>
0040 #include <fun4all/Fun4AllServer.h>
0041
0042
0043 #include <phool/PHCompositeNode.h>
0044 #include <phool/getClass.h>
0045 #include <phool/phool.h>
0046 #include <phool/PHIODataNode.h>
0047 #include <phool/PHNode.h>
0048 #include <phool/PHNodeIterator.h>
0049 #include <phool/PHObject.h>
0050
0051
0052 #include <cstdint>
0053 #include <iostream>
0054 #include <utility>
0055
0056 class PHCompositeNode;
0057 class TowerInfoContainer;
0058 class JESMCTreeGen;
0059
0060 JESMCTreeGen::JESMCTreeGen(const std::string &name, const std::string &outfilename)
0061 :SubsysReco(name)
0062 {
0063 verbosity = 0;
0064 foutname = outfilename;
0065 std::cout << "JESMCTreeGen::JESMCTreeGen(const std::string &name) Calling ctor" << std::endl;
0066 }
0067
0068 int JESMCTreeGen::Init(PHCompositeNode * ) {
0069 if (verbosity > 0) std::cout << "Processing initialization: CaloEmulatorTreeMaker::Init(PHCompositeNode *topNode)" << std::endl;
0070 file = new TFile( foutname.c_str(), "RECREATE");
0071 tree = new TTree("ttree","TTree for JES calibration");
0072
0073
0074 if (doZVertexReadout) Initialize_z_vertex();
0075
0076 if (doTowerInfoReadout) {
0077 Initialize_calo_tower();
0078 if (doTowerInfoReadout_RetowerEMCal) Initialize_calo_tower_RetowerEMCal();
0079 }
0080
0081 if (doClusterReadout) {
0082 Initialize_cluster();
0083 if (doClusterIsoReadout) Initialize_clusterIso();
0084 if (doClusterCNNReadout) Initialize_clusterCNN();
0085 }
0086
0087 if (doRecoJetReadout) {
0088 for (int ir = 0; ir < static_cast<int>(doRecoJet_radius.size()); ir++) {
0089 Initialize_jet("recojet", doRecoJet_radius[ir]);
0090 }
0091 if (doSeedJetRawReadout) Initialize_jet("seedjetraw", 0.2);
0092 if (doSeedJetSubReadout) Initialize_jet("seedjetsub", 0.2);
0093 }
0094 if (doTruthJetReadout) {
0095 for (int ir = 0; ir < static_cast<int>(doTruthJet_radius.size()); ir++) {
0096 Initialize_jet("truthjet", doTruthJet_radius[ir]);
0097 }
0098 }
0099
0100 if (doTruthParticleReadout) Initialize_truthparticle();
0101
0102 ievent = 0;
0103 return Fun4AllReturnCodes::EVENT_OK;
0104 }
0105
0106 int JESMCTreeGen::process_event(PHCompositeNode *topNode) {
0107 if (verbosity >= 0) {
0108 if (ievent%100 == 0) std::cout << "Processing event " << ievent << std::endl;
0109 }
0110
0111
0112 if (doZVertexReadout) Fill_z_vertex(topNode);
0113
0114 if (doTowerInfoReadout) {
0115 Fill_calo_tower(topNode, "CEMC");
0116 Fill_calo_tower(topNode, "HCALIN");
0117 Fill_calo_tower(topNode, "HCALOUT");
0118 if (doTowerInfoReadout_RetowerEMCal) Fill_emcal_retower(topNode);
0119 }
0120
0121 if (doClusterReadout) Fill_cluster(topNode);
0122
0123 if (doRecoJetReadout) {
0124 for (int ir = 0; ir < static_cast<int>(doRecoJet_radius.size()); ir++) {
0125 Fill_recojet(topNode, "recojet", "subtracted", doRecoJet_radius[ir]);
0126 }
0127 if (doSeedJetRawReadout) Fill_recojet(topNode, "TowerInfo_HIRecoSeedsRaw", "seedjetraw", 0.2);
0128 if (doSeedJetSubReadout) Fill_recojet(topNode, "TowerInfo_HIRecoSeedsSub", "seedjetsub", 0.2);
0129 }
0130 if (doTruthJetReadout) {
0131 for (int ir = 0; ir < static_cast<int>(doTruthJet_radius.size()); ir++) {
0132 Fill_truthjet(topNode, doTruthJet_radius[ir]);
0133 }
0134 }
0135
0136 if (doTruthParticleReadout) Fill_truthparticle(topNode);
0137
0138 tree->Fill();
0139 ievent++;
0140 return Fun4AllReturnCodes::EVENT_OK;
0141 }
0142
0143 int JESMCTreeGen::ResetEvent(PHCompositeNode * ) {
0144 if (Verbosity() > 1) std::cout << "Resetting the tree branches" << std::endl;
0145
0146 if (doClusterReadout) Reset_cluster();
0147 if (doRecoJetReadout || doTruthJetReadout) Reset_jet();
0148 if (doTruthParticleReadout) Reset_truthparticle();
0149
0150 return Fun4AllReturnCodes::EVENT_OK;
0151 }
0152
0153 int JESMCTreeGen::End(PHCompositeNode * ) {
0154 if (verbosity > 0) std::cout << "Processing end: CaloEmulatorTreeMaker::End(PHCompositeNode *topNode)" << std::endl;
0155 file->cd();
0156 tree->Write();
0157 file->Close();
0158 delete file;
0159 if (verbosity > 0) std::cout << "CaloEmulatorTreeMaker complete." << std::endl;
0160 return Fun4AllReturnCodes::EVENT_OK;
0161 }
0162
0163
0164 void JESMCTreeGen::Initialize_z_vertex() {
0165 tree->Branch("z_vertex", &z_vertex, "z_vertex/F");
0166 }
0167
0168 void JESMCTreeGen::Initialize_calo_tower() {
0169 tree->Branch("emcal_tower_e", emcal_tower_e, "emcal_tower_e[96][256]/F");
0170 tree->Branch("ihcal_tower_e", ihcal_tower_e, "ihcal_tower_e[24][64]/F");
0171 tree->Branch("ohcal_tower_e", ohcal_tower_e, "ohcal_tower_e[24][64]/F");
0172 tree->Branch("emcal_tower_time", emcal_tower_time, "emcal_tower_time[96][256]/F");
0173 tree->Branch("ihcal_tower_time", ihcal_tower_time, "ihcal_tower_time[24][64]/F");
0174 tree->Branch("ohcal_tower_time", ohcal_tower_time, "ohcal_tower_time[24][64]/F");
0175 tree->Branch("emcal_tower_status", emcal_tower_status, "emcal_tower_status[96][256]/I");
0176 tree->Branch("ihcal_tower_status", ihcal_tower_status, "ihcal_tower_status[24][64]/I");
0177 tree->Branch("ohcal_tower_status", ohcal_tower_status, "ohcal_tower_status[24][64]/I");
0178 }
0179
0180 void JESMCTreeGen::Initialize_calo_tower_RetowerEMCal() {
0181 tree->Branch("emcal_retower_e", emcal_retower_e, "emcal_retower_e[24][64]/F");
0182 }
0183
0184 void JESMCTreeGen::Initialize_cluster() {
0185 tree->Branch("cluster_e", &cluster_e);
0186 tree->Branch("cluster_pt", &cluster_pt);
0187 tree->Branch("cluster_eta", &cluster_eta);
0188 tree->Branch("cluster_phi", &cluster_phi);
0189 tree->Branch("cluster_e_core", &cluster_e_core);
0190 tree->Branch("cluster_pt_core", &cluster_pt_core);
0191 tree->Branch("cluster_eta_core", &cluster_eta_core);
0192 tree->Branch("cluster_phi_core", &cluster_phi_core);
0193 tree->Branch("cluster_probability", &cluster_probability);
0194 }
0195
0196 void JESMCTreeGen::Initialize_clusterIso() {
0197 tree->Branch("cluster_iso", &cluster_iso);
0198 }
0199
0200 void JESMCTreeGen::Initialize_clusterCNN() {
0201 tree->Branch("cluster_e_cnn", &cluster_e_cnn);
0202 tree->Branch("cluster_probability_cnn", &cluster_probability_cnn);
0203 }
0204
0205 void JESMCTreeGen::Initialize_jet(std::string jet_prefix , float radius) {
0206
0207 std::string vector_prefix = jet_prefix + "0" + std::to_string((int)(radius * 10)) + "_";
0208
0209 std::string jet_e_vectorname = vector_prefix + "e"; jet_e_map[jet_e_vectorname] = std::vector<float>(); tree->Branch(jet_e_vectorname.c_str(), &jet_e_map[jet_e_vectorname]);
0210 std::string jet_et_vectorname = vector_prefix + "et"; jet_et_map[jet_et_vectorname] = std::vector<float>(); tree->Branch(jet_et_vectorname.c_str(), &jet_et_map[jet_et_vectorname]);
0211 std::string jet_pt_vectorname = vector_prefix + "pt"; jet_pt_map[jet_pt_vectorname] = std::vector<float>(); tree->Branch(jet_pt_vectorname.c_str(), &jet_pt_map[jet_pt_vectorname]);
0212 std::string jet_eta_vectorname = vector_prefix + "eta"; jet_eta_map[jet_eta_vectorname] = std::vector<float>(); tree->Branch(jet_eta_vectorname.c_str(), &jet_eta_map[jet_eta_vectorname]);
0213 std::string jet_phi_vectorname = vector_prefix + "phi"; jet_phi_map[jet_phi_vectorname] = std::vector<float>(); tree->Branch(jet_phi_vectorname.c_str(), &jet_phi_map[jet_phi_vectorname]);
0214
0215 if (jet_prefix == "truthjet") {
0216 std::string jet_truthparticle_e_vectorname = vector_prefix + "truthparticle_e"; jet_truthparticle_e_map[jet_truthparticle_e_vectorname] = std::vector<float>(); tree->Branch(jet_truthparticle_e_vectorname.c_str(), &jet_truthparticle_e_map[jet_truthparticle_e_vectorname]);
0217 std::string jet_truthparticle_pt_vectorname = vector_prefix + "truthparticle_pt"; jet_truthparticle_pt_map[jet_truthparticle_pt_vectorname] = std::vector<float>(); tree->Branch(jet_truthparticle_pt_vectorname.c_str(), &jet_truthparticle_pt_map[jet_truthparticle_pt_vectorname]);
0218 std::string jet_truthparticle_eta_vectorname = vector_prefix + "truthparticle_eta"; jet_truthparticle_eta_map[jet_truthparticle_eta_vectorname] = std::vector<float>(); tree->Branch(jet_truthparticle_eta_vectorname.c_str(), &jet_truthparticle_eta_map[jet_truthparticle_eta_vectorname]);
0219 std::string jet_truthparticle_phi_vectorname = vector_prefix + "truthparticle_phi"; jet_truthparticle_phi_map[jet_truthparticle_phi_vectorname] = std::vector<float>(); tree->Branch(jet_truthparticle_phi_vectorname.c_str(), &jet_truthparticle_phi_map[jet_truthparticle_phi_vectorname]);
0220 std::string jet_truthparticle_pid_vectorname = vector_prefix + "truthparticle_pid"; jet_truthparticle_pid_map[jet_truthparticle_pid_vectorname] = std::vector<int>(); tree->Branch(jet_truthparticle_pid_vectorname.c_str(), &jet_truthparticle_pid_map[jet_truthparticle_pid_vectorname]);
0221 } else {
0222
0223 std::string jet_emcal_ncomponent_vectorname = vector_prefix + "emcal_ncomponent"; jet_tower_ncomponent_map[jet_emcal_ncomponent_vectorname] = std::vector<int>(); tree->Branch(jet_emcal_ncomponent_vectorname.c_str(), &jet_tower_ncomponent_map[jet_emcal_ncomponent_vectorname]);
0224 std::string jet_emcal_tower_e_vectorname = vector_prefix + "emcal_tower_e"; jet_tower_e_map[jet_emcal_tower_e_vectorname] = std::vector<float>(); tree->Branch(jet_emcal_tower_e_vectorname.c_str(), &jet_tower_e_map[jet_emcal_tower_e_vectorname]);
0225 std::string jet_emcal_tower_ieta_vectorname = vector_prefix + "emcal_tower_ieta"; jet_tower_ieta_map[jet_emcal_tower_ieta_vectorname] = std::vector<int>(); tree->Branch(jet_emcal_tower_ieta_vectorname.c_str(), &jet_tower_ieta_map[jet_emcal_tower_ieta_vectorname]);
0226 std::string jet_emcal_tower_iphi_vectorname = vector_prefix + "emcal_tower_iphi"; jet_tower_iphi_map[jet_emcal_tower_iphi_vectorname] = std::vector<int>(); tree->Branch(jet_emcal_tower_iphi_vectorname.c_str(), &jet_tower_iphi_map[jet_emcal_tower_iphi_vectorname]);
0227
0228 std::string jet_ihcal_ncomponent_vectorname = vector_prefix + "ihcal_ncomponent"; jet_tower_ncomponent_map[jet_ihcal_ncomponent_vectorname] = std::vector<int>(); tree->Branch(jet_ihcal_ncomponent_vectorname.c_str(), &jet_tower_ncomponent_map[jet_ihcal_ncomponent_vectorname]);
0229 std::string jet_ihcal_tower_e_vectorname = vector_prefix + "ihcal_tower_e"; jet_tower_e_map[jet_ihcal_tower_e_vectorname] = std::vector<float>(); tree->Branch(jet_ihcal_tower_e_vectorname.c_str(), &jet_tower_e_map[jet_ihcal_tower_e_vectorname]);
0230 std::string jet_ihcal_tower_ieta_vectorname = vector_prefix + "ihcal_tower_ieta"; jet_tower_ieta_map[jet_ihcal_tower_ieta_vectorname] = std::vector<int>(); tree->Branch(jet_ihcal_tower_ieta_vectorname.c_str(), &jet_tower_ieta_map[jet_ihcal_tower_ieta_vectorname]);
0231 std::string jet_ihcal_tower_iphi_vectorname = vector_prefix + "ihcal_tower_iphi"; jet_tower_iphi_map[jet_ihcal_tower_iphi_vectorname] = std::vector<int>(); tree->Branch(jet_ihcal_tower_iphi_vectorname.c_str(), &jet_tower_iphi_map[jet_ihcal_tower_iphi_vectorname]);
0232
0233 std::string jet_ohcal_ncomponent_vectorname = vector_prefix + "ohcal_ncomponent"; jet_tower_ncomponent_map[jet_ohcal_ncomponent_vectorname] = std::vector<int>(); tree->Branch(jet_ohcal_ncomponent_vectorname.c_str(), &jet_tower_ncomponent_map[jet_ohcal_ncomponent_vectorname]);
0234 std::string jet_ohcal_tower_e_vectorname = vector_prefix + "ohcal_tower_e"; jet_tower_e_map[jet_ohcal_tower_e_vectorname] = std::vector<float>(); tree->Branch(jet_ohcal_tower_e_vectorname.c_str(), &jet_tower_e_map[jet_ohcal_tower_e_vectorname]);
0235 std::string jet_ohcal_tower_ieta_vectorname = vector_prefix + "ohcal_tower_ieta"; jet_tower_ieta_map[jet_ohcal_tower_ieta_vectorname] = std::vector<int>(); tree->Branch(jet_ohcal_tower_ieta_vectorname.c_str(), &jet_tower_ieta_map[jet_ohcal_tower_ieta_vectorname]);
0236 std::string jet_ohcal_tower_iphi_vectorname = vector_prefix + "ohcal_tower_iphi"; jet_tower_iphi_map[jet_ohcal_tower_iphi_vectorname] = std::vector<int>(); tree->Branch(jet_ohcal_tower_iphi_vectorname.c_str(), &jet_tower_iphi_map[jet_ohcal_tower_iphi_vectorname]);
0237 }
0238 }
0239
0240 void JESMCTreeGen::Initialize_truthparticle() {
0241 tree->Branch("truthparticle_e", &truthparticle_e);
0242 tree->Branch("truthparticle_pt", &truthparticle_pt);
0243 tree->Branch("truthparticle_eta", &truthparticle_eta);
0244 tree->Branch("truthparticle_phi", &truthparticle_phi);
0245 tree->Branch("truthparticle_pid", &truthparticle_pid);
0246 }
0247
0248
0249 void JESMCTreeGen::Fill_z_vertex(PHCompositeNode *topNode) {
0250 z_vertex = -999;
0251 GlobalVertexMap *vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
0252 if (vertexmap) {
0253 if (!vertexmap->empty()) {
0254 GlobalVertex *vtx = vertexmap->begin()->second;
0255 if (vtx) {
0256 z_vertex = vtx->get_z();
0257 }
0258 } else {
0259 std::cout << "GlobalVertexMap is empty" << std::endl;
0260 }
0261 } else {
0262 std::cout << "GlobalVertexMap is missing" << std::endl;
0263 }
0264 }
0265
0266 void JESMCTreeGen::Fill_calo_tower(PHCompositeNode *topNode, std::string calorimeter) {
0267 std::string tower_info_container_name = "TOWERINFO_CALIB_" + calorimeter;
0268 TowerInfoContainer *_towers_calo = findNode::getClass<TowerInfoContainer>(topNode, tower_info_container_name);
0269 if (_towers_calo) {
0270 for (int channel = 0; channel < (int)_towers_calo->size(); ++channel) {
0271 TowerInfo *_tower = _towers_calo->get_tower_at_channel(channel);
0272 unsigned int towerkey = _towers_calo->encode_key(channel);
0273 int etabin = _towers_calo->getTowerEtaBin(towerkey);
0274 int phibin = _towers_calo->getTowerPhiBin(towerkey);
0275 float towE = _tower->get_energy();
0276 float towT = _tower->get_time_float();
0277 int towS = 1;
0278 if (!_tower->get_isHot() && !_tower->get_isNoCalib() && !_tower->get_isNotInstr() && !_tower->get_isBadChi2()) {
0279 towS = 0;
0280 }
0281 if (calorimeter == "CEMC") {
0282 emcal_tower_e[etabin][phibin] = towE;
0283 emcal_tower_time[etabin][phibin] = towT;
0284 emcal_tower_status[etabin][phibin] = towS;
0285 } else if (calorimeter == "HCALIN") {
0286 ihcal_tower_e[etabin][phibin] = towE;
0287 ihcal_tower_time[etabin][phibin] = towT;
0288 ihcal_tower_status[etabin][phibin] = towS;
0289 } else if (calorimeter == "HCALOUT") {
0290 ohcal_tower_e[etabin][phibin] = towE;
0291 ohcal_tower_time[etabin][phibin] = towT;
0292 ohcal_tower_status[etabin][phibin] = towS;
0293 }
0294 }
0295 } else {
0296 std::cout << "TowerInfoContainer for " << calorimeter << " is missing" << std::endl;
0297 }
0298 }
0299
0300 void JESMCTreeGen::Fill_emcal_retower(PHCompositeNode *topNode) {
0301 TowerInfoContainer *_towers_calo = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_CEMC_RETOWER");
0302 if (_towers_calo) {
0303 for (int channel = 0; channel < (int)_towers_calo->size(); ++channel) {
0304 TowerInfo *_tower = _towers_calo->get_tower_at_channel(channel);
0305 unsigned int towerkey = _towers_calo->encode_key(channel);
0306 int etabin = _towers_calo->getTowerEtaBin(towerkey);
0307 int phibin = _towers_calo->getTowerPhiBin(towerkey);
0308 float towE = _tower->get_energy();
0309 emcal_retower_e[etabin][phibin] = towE;
0310 }
0311 } else {
0312 std::cout << "TowerInfoContainer EMCal retower node is missing" << std::endl;
0313 }
0314 }
0315
0316 void JESMCTreeGen::Fill_cluster(PHCompositeNode *topNode) {
0317 std::string _clustername;
0318 _clustername = "CLUSTERINFO_CEMC";
0319 RawClusterContainer *_clusters = findNode::getClass<RawClusterContainer>(topNode, _clustername.c_str());
0320 if (_clusters) {
0321 RawClusterContainer::ConstRange clusterEnd = _clusters->getClusters();
0322 for (RawClusterContainer::ConstIterator clusterIter = clusterEnd.first; clusterIter != clusterEnd.second; clusterIter++) {
0323 RawCluster *_cluster = clusterIter->second;
0324 CLHEP::Hep3Vector vertex(0, 0, 0);
0325 CLHEP::Hep3Vector E_vec_cluster = RawClusterUtility::GetECoreVec(*_cluster, vertex);
0326 CLHEP::Hep3Vector E_vec_cluster_Full = RawClusterUtility::GetEVec(*_cluster, vertex);
0327 float clusE = E_vec_cluster_Full.mag();
0328 if (clusE < 1) continue;
0329 float clusEcore = E_vec_cluster.mag();
0330 float clus_eta = E_vec_cluster_Full.pseudoRapidity();
0331 float clus_phi = E_vec_cluster_Full.phi();
0332 float clus_pt = E_vec_cluster_Full.perp();
0333 float clus_coreeta = E_vec_cluster.pseudoRapidity();
0334 float clus_corephi = E_vec_cluster.phi();
0335 float clus_corept = E_vec_cluster.perp();
0336 float clus_prob = _cluster->get_prob();
0337 cluster_e.push_back(clusE);
0338 cluster_pt.push_back(clus_pt);
0339 cluster_eta.push_back(clus_eta);
0340 cluster_phi.push_back(clus_phi);
0341 cluster_e_core.push_back(clusEcore);
0342 cluster_pt_core.push_back(clus_corept);
0343 cluster_eta_core.push_back(clus_coreeta);
0344 cluster_phi_core.push_back(clus_corephi);
0345 cluster_probability.push_back(clus_prob);
0346 if (doClusterIsoReadout) {
0347 float clus_iso = _cluster->get_et_iso(4, false, true);
0348 cluster_iso.push_back(clus_iso);
0349 }
0350 }
0351 } else {
0352 std::cout << "RawClusterContainer is missing" << std::endl;
0353 }
0354 if (doClusterCNNReadout) {
0355 std::string _clustername_cnn;
0356 _clustername_cnn = "CLUSTERINFO_CEMC_CNN";
0357 RawClusterContainer *_clusters_cnn = findNode::getClass<RawClusterContainer>(topNode, _clustername_cnn.c_str());
0358 if (_clusters_cnn) {
0359 RawClusterContainer::ConstRange clusterEnd_cnn = _clusters_cnn->getClusters();
0360 for (RawClusterContainer::ConstIterator clusterIter = clusterEnd_cnn.first; clusterIter != clusterEnd_cnn.second; clusterIter++) {
0361 RawCluster *_cluster = clusterIter->second;
0362 float clus_prob_cnn = _cluster->get_prob();
0363 float clusE = _cluster->get_energy();
0364 cluster_probability_cnn.push_back(clus_prob_cnn);
0365 cluster_e_cnn.push_back(clusE);
0366 }
0367 } else {
0368 std::cout << "RawClusterContainer for CNN cluster is missing" << std::endl;
0369 }
0370 }
0371 }
0372
0373 void JESMCTreeGen::Fill_recojet(PHCompositeNode *topNode, std::string jet_prefix, std::string node_prefix, float radius) {
0374
0375 std::string vector_prefix = jet_prefix + "0" + std::to_string((int)(radius * 10)) + "_";
0376
0377 std::string nodename = "AntiKt_" + node_prefix + "_r0" + std::to_string((int)(radius * 10));
0378 JetContainer* _jets = findNode::getClass<JetContainer>(topNode, nodename);
0379 if (!_jets) std::cout << "JetContainer for " << nodename << " is missing" << std::endl;
0380
0381 TowerInfoContainer *_emcal_towers = nullptr;
0382 TowerInfoContainer *_ihcal_towers = nullptr;
0383 TowerInfoContainer *_ohcal_towers = nullptr;
0384 if (node_prefix == "TowerInfo_HIRecoSeedsRaw") {
0385 _emcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_CEMC_RETOWER");
0386 _ihcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_HCALIN");
0387 _ohcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_HCALOUT");
0388 } else {
0389 _emcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_CEMC_RETOWER_SUB1");
0390 _ihcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_HCALIN_SUB1");
0391 _ohcal_towers = findNode::getClass<TowerInfoContainer>(topNode, "TOWERINFO_CALIB_HCALOUT_SUB1");
0392 }
0393 if (!_emcal_towers || !_ihcal_towers || !_ohcal_towers) std::cout << "TowerInfoContainer is missing" << std::endl;
0394
0395 for (auto _jet : *_jets) {
0396 if (_jet->get_pt() < 1) continue;
0397 jet_e_map[vector_prefix+"e"].push_back(_jet->get_e());
0398 jet_et_map[vector_prefix+"et"].push_back(_jet->get_et());
0399 jet_pt_map[vector_prefix+"pt"].push_back(_jet->get_pt());
0400 jet_eta_map[vector_prefix+"eta"].push_back(_jet->get_eta());
0401 jet_phi_map[vector_prefix+"phi"].push_back(_jet->get_phi());
0402 int ncomponent_emcal = 0;
0403 int ncomponent_ihcal = 0;
0404 int ncomponent_ohcal = 0;
0405 for (auto comp: _jet->get_comp_vec()) {
0406 unsigned int channel = comp.second;
0407 if (comp.first == 14 || comp.first == 29 || comp.first == 25 || comp.first == 28) {
0408 TowerInfo *_tower = _emcal_towers->get_tower_at_channel(channel);
0409 unsigned int calokey = _emcal_towers->encode_key(channel);
0410 int jet_tower_ieta = _emcal_towers->getTowerEtaBin(calokey);
0411 int jet_tower_iphi = _emcal_towers->getTowerPhiBin(calokey);
0412 float jet_tower_e = _tower->get_energy();
0413 jet_tower_e_map[vector_prefix+"emcal_tower_e"].push_back(jet_tower_e);
0414 jet_tower_ieta_map[vector_prefix+"emcal_tower_ieta"].push_back(jet_tower_ieta);
0415 jet_tower_iphi_map[vector_prefix+"emcal_tower_iphi"].push_back(jet_tower_iphi);
0416 ncomponent_emcal++;
0417 } else if (comp.first == 15 || comp.first == 30 || comp.first == 26) {
0418 TowerInfo *_tower = _ihcal_towers->get_tower_at_channel(channel);
0419 unsigned int calokey = _ihcal_towers->encode_key(channel);
0420 int jet_tower_ieta = _ihcal_towers->getTowerEtaBin(calokey);
0421 int jet_tower_iphi = _ihcal_towers->getTowerPhiBin(calokey);
0422 float jet_tower_e = _tower->get_energy();
0423 jet_tower_e_map[vector_prefix+"ihcal_tower_e"].push_back(jet_tower_e);
0424 jet_tower_ieta_map[vector_prefix+"ihcal_tower_ieta"].push_back(jet_tower_ieta);
0425 jet_tower_iphi_map[vector_prefix+"ihcal_tower_iphi"].push_back(jet_tower_iphi);
0426 ncomponent_ihcal++;
0427 } else if (comp.first == 16 || comp.first == 31 || comp.first == 27) {
0428 TowerInfo *_tower = _ohcal_towers->get_tower_at_channel(channel);
0429 unsigned int calokey = _ohcal_towers->encode_key(channel);
0430 int jet_tower_ieta = _ohcal_towers->getTowerEtaBin(calokey);
0431 int jet_tower_iphi = _ohcal_towers->getTowerPhiBin(calokey);
0432 float jet_tower_e = _tower->get_energy();
0433 jet_tower_e_map[vector_prefix+"ohcal_tower_e"].push_back(jet_tower_e);
0434 jet_tower_ieta_map[vector_prefix+"ohcal_tower_ieta"].push_back(jet_tower_ieta);
0435 jet_tower_iphi_map[vector_prefix+"ohcal_tower_iphi"].push_back(jet_tower_iphi);
0436 ncomponent_ohcal++;
0437 }
0438 }
0439 jet_tower_ncomponent_map[vector_prefix+"emcal_ncomponent"].push_back(ncomponent_emcal);
0440 jet_tower_ncomponent_map[vector_prefix+"ihcal_ncomponent"].push_back(ncomponent_ihcal);
0441 jet_tower_ncomponent_map[vector_prefix+"ohcal_ncomponent"].push_back(ncomponent_ohcal);
0442 }
0443 }
0444
0445 void JESMCTreeGen::Fill_truthjet(PHCompositeNode *topNode, float radius) {
0446
0447 std::string vector_prefix = "truthjet0" + std::to_string((int)(radius * 10)) + "_";
0448
0449 std::string nodename = "AntiKt_Truth_r0" + std::to_string((int)(radius * 10));
0450 JetContainer* _truth_jets = findNode::getClass<JetContainer>(topNode, nodename);
0451 if (!_truth_jets) std::cout << "JetContainer for " << nodename << " is missing" << std::endl;
0452 PHG4TruthInfoContainer *truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
0453 if (_truth_jets && truthinfo) {
0454 for (auto _truthjet : *_truth_jets) {
0455 if (_truthjet->get_eta() < -2 || _truthjet->get_eta() > 2 || _truthjet->get_pt() < 5 || _truthjet->get_pt() > 100) continue;
0456 jet_e_map[vector_prefix+"e"].push_back(_truthjet->get_e());
0457 jet_et_map[vector_prefix+"et"].push_back(_truthjet->get_et());
0458 jet_pt_map[vector_prefix+"pt"].push_back(_truthjet->get_pt());
0459 jet_eta_map[vector_prefix+"eta"].push_back(_truthjet->get_eta());
0460 jet_phi_map[vector_prefix+"phi"].push_back(_truthjet->get_phi());
0461 for (auto comp: _truthjet->get_comp_vec()) {
0462 PHG4Particle* _truthparticle = truthinfo->GetParticle(comp.second);
0463 float particle_e = _truthparticle->get_e();
0464 float particle_pt = sqrt(_truthparticle->get_px() * _truthparticle->get_px() + _truthparticle->get_py() * _truthparticle->get_py());
0465 float particle_eta = atanh(_truthparticle->get_pz() / sqrt(_truthparticle->get_px()*_truthparticle->get_px()+_truthparticle->get_py()*_truthparticle->get_py()+_truthparticle->get_pz()*_truthparticle->get_pz()));
0466 float particle_phi = atan2(_truthparticle->get_py(), _truthparticle->get_px());
0467 int particle_pid = _truthparticle->get_pid();
0468 jet_truthparticle_e_map[vector_prefix+"truthparticle_e"].push_back(particle_e);
0469 jet_truthparticle_pt_map[vector_prefix+"truthparticle_pt"].push_back(particle_pt);
0470 jet_truthparticle_eta_map[vector_prefix+"truthparticle_eta"].push_back(particle_eta);
0471 jet_truthparticle_phi_map[vector_prefix+"truthparticle_phi"].push_back(particle_phi);
0472 jet_truthparticle_pid_map[vector_prefix+"truthparticle_pid"].push_back(particle_pid);
0473 }
0474 }
0475 } else {
0476 std::cout << "JetContainer for " << nodename << " is missing, or PHG4TruthInfoContainer is missing" << std::endl;
0477 }
0478 }
0479
0480 void JESMCTreeGen::Fill_truthparticle(PHCompositeNode *topNode) {
0481 PHG4TruthInfoContainer *truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
0482 if (truthinfo) {
0483 PHG4TruthInfoContainer::Range range = truthinfo->GetPrimaryParticleRange();
0484 for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) {
0485 PHG4Particle *truth = iter->second;
0486 if (!truthinfo->is_primary(truth)) continue;
0487 float particle_eta = atanh(truth->get_pz() / sqrt(truth->get_px()*truth->get_px()+truth->get_py()*truth->get_py()+truth->get_pz()*truth->get_pz()));
0488 if (fabs(particle_eta) > 1.6) continue;
0489 float particle_e = truth->get_e();
0490 float particle_pt = sqrt(truth->get_px() * truth->get_px() + truth->get_py() * truth->get_py());
0491 float particle_phi = atan2(truth->get_py(), truth->get_px());
0492 int particle_pid = truth->get_pid();
0493 truthparticle_e.push_back(particle_e);
0494 truthparticle_pt.push_back(particle_pt);
0495 truthparticle_eta.push_back(particle_eta);
0496 truthparticle_phi.push_back(particle_phi);
0497 truthparticle_pid.push_back(particle_pid);
0498 }
0499 } else {
0500 std::cout << "PHG4TruthInfoContainer is missing" << std::endl;
0501 }
0502 }
0503
0504
0505 void JESMCTreeGen::Reset_cluster() {
0506 cluster_e.clear();
0507 cluster_pt.clear();
0508 cluster_eta.clear();
0509 cluster_phi.clear();
0510 cluster_e_core.clear();
0511 cluster_pt_core.clear();
0512 cluster_eta_core.clear();
0513 cluster_phi_core.clear();
0514 cluster_probability.clear();
0515 if (doClusterIsoReadout) {
0516 cluster_iso.clear();
0517 }
0518 if (doClusterCNNReadout) {
0519 cluster_e_cnn.clear();
0520 cluster_probability_cnn.clear();
0521 }
0522 }
0523
0524 void JESMCTreeGen::Reset_jet() {
0525 for (auto& entry : jet_e_map) entry.second.clear();
0526 for (auto& entry : jet_et_map) entry.second.clear();
0527 for (auto& entry : jet_pt_map) entry.second.clear();
0528 for (auto& entry : jet_eta_map) entry.second.clear();
0529 for (auto& entry : jet_phi_map) entry.second.clear();
0530 if (doRecoJetReadout) {
0531 for (auto& entry : jet_tower_ncomponent_map) entry.second.clear();
0532 for (auto& entry : jet_tower_e_map) entry.second.clear();
0533 for (auto& entry : jet_tower_ieta_map) entry.second.clear();
0534 for (auto& entry : jet_tower_iphi_map) entry.second.clear();
0535 }
0536 if (doTruthJetReadout) {
0537 for (auto& entry : jet_truthparticle_e_map) entry.second.clear();
0538 for (auto& entry : jet_truthparticle_pt_map) entry.second.clear();
0539 for (auto& entry : jet_truthparticle_eta_map) entry.second.clear();
0540 for (auto& entry : jet_truthparticle_phi_map) entry.second.clear();
0541 for (auto& entry : jet_truthparticle_pid_map) entry.second.clear();
0542 }
0543 }
0544
0545 void JESMCTreeGen::Reset_truthparticle() {
0546 truthparticle_e.clear();
0547 truthparticle_pt.clear();
0548 truthparticle_eta.clear();
0549 truthparticle_phi.clear();
0550 truthparticle_pid.clear();
0551 }