File indexing completed on 2025-12-16 09:20:04
0001 #include "JetContainerv1.h"
0002 #include "Jetv2.h"
0003
0004 #include <phool/phool.h> // for PHWHERE
0005
0006 #include <format>
0007 #include <limits>
0008 #include <string>
0009
0010 JetContainerv1::JetContainerv1() : m_clones(new TClonesArray("Jetv2", 50))
0011 {
0012
0013 }
0014
0015 void JetContainerv1::identify(std::ostream& os) const
0016 {
0017 os << "JetContainerv1: size = " << m_clones->GetEntriesFast() << std::endl
0018 << " Contains jets with the following properties:" << std::endl;
0019 print_property_types(os);
0020 return;
0021 }
0022
0023 JetContainerv1::JetContainerv1(const JetContainer& rhs)
0024 : m_clones(rhs.clone_data()), m_njets{rhs.size()}
0025 , m_pindex{rhs.property_indices()}
0026 , m_psize{rhs.size_properties()}
0027 , m_RhoMedian{rhs.get_rho_median()}
0028 {
0029
0030
0031 for (auto src = rhs.begin_src(); src != rhs.end_src(); ++src)
0032 {
0033 m_src.insert(*src);
0034 }
0035
0036 m_jetpar_R = rhs.get_jetpar_R();
0037 }
0038
0039 JetContainerv1::~JetContainerv1()
0040 {
0041 JetContainerv1::Reset();
0042 delete m_clones;
0043 }
0044
0045 void JetContainerv1::Reset()
0046 {
0047 m_clones->Clear("C");
0048 m_njets = 0;
0049 m_RhoMedian = std::numeric_limits<float>::quiet_NaN();
0050 }
0051
0052 Jet* JetContainerv1::add_jet()
0053 {
0054 auto *jet = (Jet*) m_clones->ConstructedAt(m_njets++, "C");
0055 jet->resize_properties(m_psize);
0056 return jet;
0057 }
0058
0059 Jet* JetContainerv1::get_jet(unsigned int ijet)
0060 {
0061 if (ijet < m_njets)
0062 {
0063 return (Jet*) m_clones->At(ijet);
0064 }
0065
0066 return nullptr;
0067
0068 }
0069
0070 Jet* JetContainerv1::get_UncheckedAt(unsigned int index)
0071 {
0072 return (Jet*) m_clones->UncheckedAt(index);
0073 }
0074
0075
0076
0077
0078
0079 void JetContainerv1::print_jets(std::ostream& os)
0080 {
0081 os << " No. of jets: " << m_njets;
0082 if (!std::isnan(m_RhoMedian))
0083 {
0084 os << " rho median " << m_RhoMedian;
0085 }
0086 os << std::endl;
0087
0088 int ijet = 0;
0089 for (auto *jet : *this)
0090 {
0091 os << std::format(" jet({:2}) : pT({:6.2f}) eta({:6.2f}) phi({:6.2f})", ijet, jet->get_pt(), jet->get_eta(), jet->get_phi());
0092 ++ijet;
0093
0094 for (auto prop : m_pindex)
0095 {
0096 os << std::format(" {:>8}({:6.2f})", str_Jet_PROPERTY(prop.first), jet->get_property(prop.second));
0097
0098 }
0099 os << std::endl;
0100 }
0101 os << std::endl;
0102 }
0103
0104 void JetContainerv1::print_property_types(std::ostream& os) const
0105 {
0106 os << " Jet properties in Jet vectors: " << std::endl;
0107 int i = 0;
0108 for (auto p : m_pindex)
0109 {
0110 os << " (" << i++ << ") -> " << str_Jet_PROPERTY(p.first) << std::endl;
0111 }
0112 return;
0113 }
0114
0115
0116 size_t JetContainerv1::add_property(Jet::PROPERTY prop)
0117 {
0118 auto [iter, is_new] = m_pindex.try_emplace(prop, static_cast<Jet::PROPERTY>(m_psize));
0119 if (is_new)
0120 {
0121 ++m_psize;
0122 resize_jet_pvecs();
0123 }
0124 return m_psize;
0125 }
0126
0127 size_t JetContainerv1::add_property(std::set<Jet::PROPERTY> props)
0128 {
0129 bool added = false;
0130 for (auto prop : props)
0131 {
0132 auto [iter, is_new] = m_pindex.try_emplace(prop, static_cast<Jet::PROPERTY>(m_psize));
0133 if (is_new)
0134 {
0135 ++m_psize;
0136 added = true;
0137 }
0138 }
0139 if (added)
0140 {
0141 resize_jet_pvecs();
0142 }
0143 return m_psize;
0144 }
0145
0146
0147 Jet::PROPERTY JetContainerv1::property_index(Jet::PROPERTY prop)
0148 {
0149 if (!has_property(prop))
0150 {
0151 add_property(prop);
0152 }
0153 return m_pindex[prop];
0154 }
0155
0156 Jet::IterJetTCA JetContainerv1::begin()
0157 {
0158 return Jet::IterJetTCA(m_clones);
0159 }
0160
0161 Jet::IterJetTCA JetContainerv1::end()
0162 {
0163 auto rval = Jet::IterJetTCA(m_clones);
0164 rval.index = rval.size;
0165 return rval;
0166 }
0167
0168 void JetContainerv1::resize_jet_pvecs()
0169 {
0170 for (auto *jet : *this)
0171 {
0172 jet->resize_properties(m_psize);
0173 }
0174 return;
0175 }
0176
0177 std::string JetContainerv1::str_Jet_PROPERTY(Jet::PROPERTY prop)
0178 {
0179 switch (prop)
0180 {
0181 case Jet::PROPERTY::prop_JetCharge:
0182 return "JetCharge";
0183 case Jet::PROPERTY::prop_BFrac:
0184 return "BFrac";
0185 case Jet::PROPERTY::prop_SeedD:
0186 return "SeedD";
0187 case Jet::PROPERTY::prop_SeedItr:
0188 return "SeedItr";
0189 case Jet::PROPERTY::prop_zg:
0190 return "zg";
0191 case Jet::PROPERTY::prop_Rg:
0192 return "Rg";
0193 case Jet::PROPERTY::prop_mu:
0194 return "mu";
0195 case Jet::PROPERTY::prop_gamma:
0196 return "gamma";
0197 case Jet::PROPERTY::prop_JetHadronFlavor:
0198 return "JetHadronFlavor";
0199 case Jet::PROPERTY::prop_JetHadronZT:
0200 return "JetHadronZT";
0201 case Jet::PROPERTY::prop_area:
0202 return "area";
0203 default:
0204 return "no_property";
0205 }
0206 return "";
0207 }