File indexing completed on 2025-08-06 08:17:43
0001 #include "CopyAndSubtractJets.h"
0002
0003 #include "TowerBackground.h"
0004
0005 #include <calobase/RawTower.h>
0006 #include <calobase/RawTowerContainer.h>
0007 #include <calobase/RawTowerDefs.h>
0008 #include <calobase/RawTowerGeom.h>
0009 #include <calobase/RawTowerGeomContainer.h>
0010 #include <calobase/TowerInfo.h>
0011 #include <calobase/TowerInfoContainer.h>
0012
0013 #include <jetbase/Jet.h>
0014 #include <jetbase/JetContainer.h>
0015 #include <jetbase/JetContainerv1.h>
0016
0017 #include <fun4all/Fun4AllReturnCodes.h>
0018 #include <fun4all/SubsysReco.h>
0019
0020 #include <phool/PHCompositeNode.h>
0021 #include <phool/PHIODataNode.h>
0022 #include <phool/PHNode.h>
0023 #include <phool/PHNodeIterator.h>
0024 #include <phool/PHObject.h>
0025 #include <phool/getClass.h>
0026 #include <phool/phool.h>
0027
0028
0029 #include <cmath>
0030 #include <cstdlib>
0031 #include <iostream>
0032 #include <utility>
0033 #include <vector>
0034
0035 CopyAndSubtractJets::CopyAndSubtractJets(const std::string &name)
0036 : SubsysReco(name)
0037 {
0038 }
0039
0040 int CopyAndSubtractJets::InitRun(PHCompositeNode *topNode)
0041 {
0042 CreateNode(topNode);
0043
0044 return Fun4AllReturnCodes::EVENT_OK;
0045 }
0046
0047 int CopyAndSubtractJets::process_event(PHCompositeNode *topNode)
0048 {
0049 if (Verbosity() > 0)
0050 {
0051 std::cout << "CopyAndSubtractJets::process_event: entering, with _use_flow_modulation = " << _use_flow_modulation << std::endl;
0052 }
0053
0054
0055 RawTowerContainer *towersEM3 = nullptr;
0056 RawTowerContainer *towersIH3 = nullptr;
0057 RawTowerContainer *towersOH3 = nullptr;
0058 TowerInfoContainer *towerinfosEM3 = nullptr;
0059 TowerInfoContainer *towerinfosIH3 = nullptr;
0060 TowerInfoContainer *towerinfosOH3 = nullptr;
0061 if (m_use_towerinfo)
0062 {
0063 EMTowerName = m_towerNodePrefix + "_CEMC_RETOWER";
0064 IHTowerName = m_towerNodePrefix + "_HCALIN";
0065 OHTowerName = m_towerNodePrefix + "_HCALOUT";
0066 towerinfosEM3 = findNode::getClass<TowerInfoContainer>(topNode, EMTowerName);
0067 towerinfosIH3 = findNode::getClass<TowerInfoContainer>(topNode, IHTowerName);
0068 towerinfosOH3 = findNode::getClass<TowerInfoContainer>(topNode, OHTowerName);
0069 if (!towerinfosEM3)
0070 {
0071 std::cout << "CopyAndSubtractJets::process_event: Cannot find node " << EMTowerName << std::endl;
0072 exit(1);
0073 }
0074 if (!towerinfosIH3)
0075 {
0076 std::cout << "CopyAndSubtractJets::process_event: Cannot find node " << IHTowerName << std::endl;
0077 exit(1);
0078 }
0079 if (!towerinfosOH3)
0080 {
0081 std::cout << "CopyAndSubtractJets::process_event: Cannot find node " << OHTowerName << std::endl;
0082 exit(1);
0083 }
0084 }
0085 else
0086 {
0087 towersEM3 = findNode::getClass<RawTowerContainer>(topNode, "TOWER_CALIB_CEMC_RETOWER");
0088 towersIH3 = findNode::getClass<RawTowerContainer>(topNode, "TOWER_CALIB_HCALIN");
0089 towersOH3 = findNode::getClass<RawTowerContainer>(topNode, "TOWER_CALIB_HCALOUT");
0090 }
0091
0092 RawTowerGeomContainer *geomIH = findNode::getClass<RawTowerGeomContainer>(topNode, "TOWERGEOM_HCALIN");
0093 RawTowerGeomContainer *geomOH = findNode::getClass<RawTowerGeomContainer>(topNode, "TOWERGEOM_HCALOUT");
0094
0095
0096 JetContainer *unsub_jets;
0097 JetContainer *sub_jets;
0098 TowerBackground *background;
0099 if (m_use_towerinfo)
0100 {
0101 unsub_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_TowerInfo_HIRecoSeedsRaw_r02");
0102 sub_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_TowerInfo_HIRecoSeedsSub_r02");
0103 background = findNode::getClass<TowerBackground>(topNode, "TowerInfoBackground_Sub1");
0104 }
0105 else
0106 {
0107 unsub_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_Tower_HIRecoSeedsRaw_r02");
0108 sub_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_Tower_HIRecoSeedsSub_r02");
0109 background = findNode::getClass<TowerBackground>(topNode, "TowerBackground_Sub1");
0110 }
0111 std::vector<float> background_UE_0 = background->get_UE(0);
0112 std::vector<float> background_UE_1 = background->get_UE(1);
0113 std::vector<float> background_UE_2 = background->get_UE(2);
0114
0115 float background_v2 = background->get_v2();
0116 float background_Psi2 = background->get_Psi2();
0117
0118 if (Verbosity() > 0)
0119 {
0120 std::cout << "CopyAndSubtractJets::process_event: entering with # unsubtracted jets = " << unsub_jets->size() << std::endl;
0121 std::cout << "CopyAndSubtractJets::process_event: entering with # subtracted jets = " << sub_jets->size() << std::endl;
0122 }
0123
0124
0125 int ijet = 0;
0126 for (auto *this_jet : *unsub_jets)
0127 {
0128 float this_pt = this_jet->get_pt();
0129 float this_phi = this_jet->get_phi();
0130 float this_eta = this_jet->get_eta();
0131
0132 float new_total_px = 0;
0133 float new_total_py = 0;
0134 float new_total_pz = 0;
0135 float new_total_e = 0;
0136
0137
0138
0139 if (Verbosity() > 1 && this_jet->get_pt() > 5)
0140 {
0141 std::cout << "CopyAndSubtractJets::process_event: unsubtracted jet with pt / eta / phi = " << this_pt << " / " << this_eta << " / " << this_phi << std::endl;
0142 }
0143
0144 for (const auto &comp : this_jet->get_comp_vec())
0145 {
0146 RawTower *tower = nullptr;
0147 RawTowerGeom *tower_geom = nullptr;
0148 TowerInfo *towerinfo = nullptr;
0149
0150 double comp_e = 0;
0151 double comp_eta = 0;
0152 double comp_phi = 0;
0153
0154 int comp_ieta = 0;
0155
0156 double comp_background = 0;
0157
0158 if (m_use_towerinfo)
0159 {
0160 if (comp.first == 5 || comp.first == 26)
0161 {
0162 towerinfo = towerinfosIH3->get_tower_at_channel(comp.second);
0163 unsigned int towerkey = towerinfosIH3->encode_key(comp.second);
0164 comp_ieta = towerinfosIH3->getTowerEtaBin(towerkey);
0165 int comp_iphi = towerinfosIH3->getTowerPhiBin(towerkey);
0166 const RawTowerDefs::keytype key = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, comp_ieta, comp_iphi);
0167
0168 tower_geom = geomIH->get_tower_geometry(key);
0169 comp_background = background_UE_1.at(comp_ieta);
0170 }
0171 else if (comp.first == 7 || comp.first == 27)
0172 {
0173 towerinfo = towerinfosOH3->get_tower_at_channel(comp.second);
0174 unsigned int towerkey = towerinfosOH3->encode_key(comp.second);
0175 comp_ieta = towerinfosOH3->getTowerEtaBin(towerkey);
0176 int comp_iphi = towerinfosOH3->getTowerPhiBin(towerkey);
0177 const RawTowerDefs::keytype key = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALOUT, comp_ieta, comp_iphi);
0178 tower_geom = geomOH->get_tower_geometry(key);
0179 comp_background = background_UE_2.at(comp_ieta);
0180 }
0181 else if (comp.first == 13 || comp.first == 28)
0182 {
0183 towerinfo = towerinfosEM3->get_tower_at_channel(comp.second);
0184 unsigned int towerkey = towerinfosEM3->encode_key(comp.second);
0185 comp_ieta = towerinfosEM3->getTowerEtaBin(towerkey);
0186 int comp_iphi = towerinfosEM3->getTowerPhiBin(towerkey);
0187 const RawTowerDefs::keytype key = RawTowerDefs::encode_towerid(RawTowerDefs::CalorimeterId::HCALIN, comp_ieta, comp_iphi);
0188
0189 tower_geom = geomIH->get_tower_geometry(key);
0190 comp_background = background_UE_0.at(comp_ieta);
0191 }
0192 if (towerinfo)
0193 {
0194 comp_e = towerinfo->get_energy();
0195 }
0196 }
0197 else
0198 {
0199 if (comp.first == 5)
0200 {
0201 tower = towersIH3->getTower(comp.second);
0202 tower_geom = geomIH->get_tower_geometry(tower->get_key());
0203
0204 comp_ieta = geomIH->get_etabin(tower_geom->get_eta());
0205 comp_background = background_UE_1.at(comp_ieta);
0206 }
0207 else if (comp.first == 7)
0208 {
0209 tower = towersOH3->getTower(comp.second);
0210 tower_geom = geomOH->get_tower_geometry(tower->get_key());
0211
0212 comp_ieta = geomOH->get_etabin(tower_geom->get_eta());
0213 comp_background = background_UE_2.at(comp_ieta);
0214 }
0215 else if (comp.first == 13)
0216 {
0217 tower = towersEM3->getTower(comp.second);
0218 tower_geom = geomIH->get_tower_geometry(tower->get_key());
0219
0220 comp_ieta = geomIH->get_etabin(tower_geom->get_eta());
0221 comp_background = background_UE_0.at(comp_ieta);
0222 }
0223 if (tower)
0224 {
0225 comp_e = tower->get_energy();
0226 }
0227 }
0228
0229 if (tower_geom)
0230 {
0231 comp_eta = tower_geom->get_eta();
0232 comp_phi = tower_geom->get_phi();
0233 }
0234
0235 if (Verbosity() > 4 && this_jet->get_pt() > 5)
0236 {
0237 std::cout << "CopyAndSubtractJets::process_event: --> constituent in layer " << comp.first << ", has unsub E = " << comp_e << ", is at ieta #" << comp_ieta << ", and has UE = " << comp_background << std::endl;
0238 }
0239
0240
0241 if (_use_flow_modulation)
0242 {
0243 comp_background = comp_background * (1 + 2 * background_v2 * cos(2 * (comp_phi - background_Psi2)));
0244 if (Verbosity() > 4 && this_jet->get_pt() > 5)
0245 {
0246 std::cout << "CopyAndSubtractJets::process_event: --> --> flow mod, at phi = " << comp_phi << ", v2 and Psi2 are = " << background_v2 << " , " << background_Psi2 << ", UE after modulation = " << comp_background << std::endl;
0247 }
0248 }
0249
0250
0251 double comp_sub_e = comp_e - comp_background;
0252
0253
0254
0255 double comp_px = comp_sub_e / cosh(comp_eta) * cos(comp_phi);
0256 double comp_py = comp_sub_e / cosh(comp_eta) * sin(comp_phi);
0257 double comp_pz = comp_sub_e * tanh(comp_eta);
0258
0259 new_total_px += comp_px;
0260 new_total_py += comp_py;
0261 new_total_pz += comp_pz;
0262 new_total_e += comp_sub_e;
0263 }
0264
0265 auto *new_jet = sub_jets->add_jet();
0266
0267 new_jet->set_px(new_total_px);
0268 new_jet->set_py(new_total_py);
0269 new_jet->set_pz(new_total_pz);
0270 new_jet->set_e(new_total_e);
0271 new_jet->set_id(ijet);
0272
0273 if (Verbosity() > 1 && this_pt > 5)
0274 {
0275 std::cout << "CopyAndSubtractJets::process_event: old jet #" << ijet << ", old px / py / pz / e = " << this_jet->get_px() << " / " << this_jet->get_py() << " / " << this_jet->get_pz() << " / " << this_jet->get_e() << std::endl;
0276 std::cout << "CopyAndSubtractJets::process_event: new jet #" << ijet << ", new px / py / pz / e = " << new_jet->get_px() << " / " << new_jet->get_py() << " / " << new_jet->get_pz() << " / " << new_jet->get_e() << std::endl;
0277 }
0278
0279 ijet++;
0280 }
0281
0282 if (Verbosity() > 0)
0283 {
0284 std::cout << "CopyAndSubtractJets::process_event: exiting with # subtracted jets = " << sub_jets->size() << std::endl;
0285 }
0286
0287 return Fun4AllReturnCodes::EVENT_OK;
0288 }
0289
0290 int CopyAndSubtractJets::End(PHCompositeNode * )
0291 {
0292 return Fun4AllReturnCodes::EVENT_OK;
0293 }
0294
0295 int CopyAndSubtractJets::CreateNode(PHCompositeNode *topNode)
0296 {
0297 PHNodeIterator iter(topNode);
0298
0299
0300 PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0301 if (!dstNode)
0302 {
0303 std::cout << PHWHERE << "DST Node missing, doing nothing." << std::endl;
0304 return Fun4AllReturnCodes::ABORTRUN;
0305 }
0306
0307
0308 PHCompositeNode *antiktNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "ANTIKT"));
0309 if (!antiktNode)
0310 {
0311 std::cout << PHWHERE << "ANTIKT node not found, doing nothing." << std::endl;
0312 }
0313
0314
0315 PHCompositeNode *towerNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "TOWER"));
0316 if (!towerNode)
0317 {
0318 std::cout << PHWHERE << "TOWER node not found, doing nothing." << std::endl;
0319 }
0320
0321
0322 JetContainer *test_jets;
0323 if (m_use_towerinfo)
0324 {
0325 test_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_TowerInfo_HIRecoSeedsSub_r02");
0326 }
0327 else
0328 {
0329 test_jets = findNode::getClass<JetContainer>(topNode, "AntiKt_Tower_HIRecoSeedsSub_r02");
0330 }
0331 if (!test_jets)
0332 {
0333 JetContainer *sub_jets = new JetContainerv1();
0334 PHIODataNode<PHObject> *subjetNode;
0335 if (m_use_towerinfo)
0336 {
0337 if (Verbosity() > 0)
0338 {
0339 std::cout << "CopyAndSubtractJets::CreateNode : creating AntiKt_TowerInfo_HIRecoSeedsSub_r02 node " << std::endl;
0340 }
0341 subjetNode = new PHIODataNode<PHObject>(sub_jets, "AntiKt_TowerInfo_HIRecoSeedsSub_r02", "PHObject");
0342 }
0343 else
0344 {
0345 if (Verbosity() > 0)
0346 {
0347 std::cout << "CopyAndSubtractJets::CreateNode : creating AntiKt_Tower_HIRecoSeedsSub_r02 node " << std::endl;
0348 }
0349 subjetNode = new PHIODataNode<PHObject>(sub_jets, "AntiKt_Tower_HIRecoSeedsSub_r02", "PHObject");
0350 }
0351 towerNode->addNode(subjetNode);
0352 }
0353 else
0354 {
0355 std::cout << "CopyAndSubtractJets::CreateNode : AntiKt_Tower_HIRecoSeedsSub_r02 already exists! " << std::endl;
0356 }
0357
0358 return Fun4AllReturnCodes::EVENT_OK;
0359 }