Back to home page

sPhenix code displayed by LXR

 
 

    


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 //  Interface for adding, setting, and getting jet properties
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 //    unsigned int i = 0;
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 //      i++;
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 // Add properties to the jets.
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 // get the index for a given property
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()  // dummy implementation -- don't anticipate that it will ever be checked
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 }