Back to home page

sPhenix code displayed by LXR

 
 

    


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