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