Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:17:46

0001 /*!
0002  * \file Jetv2.C
0003  * \brief
0004  * \author Jin Huang <jhuang@bnl.gov>
0005  * \version $Revision:   $
0006  * \date $Date: $
0007  */
0008 
0009 #include "Jetv2.h"
0010 
0011 #include <phool/phool.h>
0012 #include <algorithm>
0013 #include <cmath>
0014 #include <iostream>
0015 
0016 class PHObject;
0017 
0018 Jetv2::Jetv2(unsigned int n_prop)
0019   : _properties(n_prop, std::numeric_limits<float>::quiet_NaN())
0020 {
0021 }
0022 
0023 void Jetv2::identify(std::ostream& os) const
0024 {
0025   os << "---Jet v2-----------------------" << std::endl;
0026   os << "jetid: " << get_id() << std::endl;
0027   os << " (px,py,pz,e) =  (" << get_px() << ", " << get_py() << ", ";
0028   os << get_pz() << ", " << get_e() << ") GeV" << std::endl;
0029 
0030   os << " Jet Properties:";
0031   for (const auto& val : _properties)
0032   {
0033     os << " " << val;
0034   }
0035   os << std::endl;
0036 
0037   os << " Jet Components: " << _comp_ids.size() << std::endl;
0038   ;
0039   return;
0040 }
0041 
0042 void Jetv2::print_comp(std::ostream& os, bool single_line)
0043 {
0044   for (auto iter = comp_begin(); iter != comp_end(); ++iter)
0045   {
0046     os << " (" << iter->first << "->" << static_cast<int>(iter->second) << ")";
0047     if (!single_line)
0048     {
0049       os << std::endl;
0050     }
0051   }
0052   if (single_line)
0053   {
0054     os << std::endl;
0055   }
0056 }
0057 
0058 std::vector<Jet::SRC> Jetv2::comp_src_vec()
0059 {
0060   std::vector<Jet::SRC> vec{};
0061   auto iter = comp_begin();
0062   auto iter_end = comp_end();
0063   if (iter == iter_end)
0064   {
0065     return vec;
0066   }
0067   while (iter != iter_end)
0068   {
0069     Jet::SRC src = iter->first;
0070     vec.push_back(src);
0071     iter = comp_end(src);
0072   }
0073   return vec;
0074 }
0075 
0076 std::map<Jet::SRC, size_t> Jetv2::comp_src_sizemap()
0077 {
0078   std::map<Jet::SRC, size_t> sizemap{};
0079   auto iter = comp_begin();
0080   auto iter_end = comp_end();
0081   if (iter == iter_end)
0082   {
0083     return sizemap;
0084   }
0085   while (iter != iter_end)
0086   {
0087     Jet::SRC src = iter->first;
0088     auto iter_ub = comp_end(src);
0089     sizemap.insert(std::make_pair(src, static_cast<size_t>(iter_ub - iter)));
0090     iter = iter_ub;
0091   }
0092   return sizemap;
0093 }
0094 
0095 void Jetv2::Reset()
0096 {
0097   _id = 0xFFFFFFFF;
0098   std::fill(std::begin(_mom), std::end(_mom), std::numeric_limits<float>::quiet_NaN());
0099   _e = std::numeric_limits<float>::quiet_NaN();
0100   _comp_ids.clear();
0101   _properties.clear();
0102 }
0103 
0104 int Jetv2::isValid() const
0105 {
0106   if (_id == 0xFFFFFFFF)
0107   {
0108     return 0;
0109   }
0110   for (float i : _mom)
0111   {
0112     if (std::isnan(i))
0113     {
0114       return 0;
0115     }
0116   }
0117   if (std::isnan(_e))
0118   {
0119     return 0;
0120   }
0121   if (_comp_ids.empty())
0122   {
0123     return 0;
0124   }
0125   return 1;
0126 }
0127 
0128 PHObject* Jetv2::CloneMe() const
0129 {
0130   Jet* jet = new Jetv2(*this);
0131   return jet;
0132 }
0133 
0134 float Jetv2::get_p() const
0135 {
0136   return std::sqrt((get_px() * get_px()) + (get_py() * get_py()) + (get_pz() * get_pz()));
0137 }
0138 
0139 float Jetv2::get_pt() const
0140 {
0141   return std::sqrt((get_px() * get_px()) + (get_py() * get_py()));
0142 }
0143 
0144 float Jetv2::get_et() const
0145 {
0146   return get_pt() / get_p() * get_e();
0147 }
0148 
0149 float Jetv2::get_eta() const
0150 {
0151   return std::asinh(get_pz() / get_pt());
0152 }
0153 
0154 float Jetv2::get_phi() const
0155 {
0156   return std::atan2(get_py(), get_px());
0157 }
0158 
0159 float Jetv2::get_mass() const
0160 {
0161   // follow CLHEP convention and return negative mass if E^2 - p^2 < 0
0162   float mass2 = get_mass2();
0163   if (mass2 < 0)
0164   {
0165     return -1 * std::sqrt(std::fabs(mass2));
0166   }
0167   return std::sqrt(mass2);
0168 }
0169 
0170 float Jetv2::get_mass2() const
0171 {
0172   float p2 = (get_px() * get_px()) + (get_py() * get_py()) + (get_pz() * get_pz());
0173   return (get_e() * get_e()) - p2;
0174 }
0175 
0176 size_t Jetv2::num_comp(Jet::SRC iSRC)
0177 {
0178   if (iSRC == Jet::SRC::VOID)
0179   {
0180     return (comp_end() - comp_begin());
0181   }
0182   return (comp_end(iSRC) - comp_begin(iSRC));
0183 }
0184 
0185 void Jetv2::insert_comp(SRC iSRC, unsigned int compid)
0186 {
0187   _is_sorted = false;
0188   _comp_ids.emplace_back(iSRC, compid);
0189 }
0190 void Jetv2::insert_comp(SRC iSRC, unsigned int compid, bool /*skip_flag*/)
0191 {
0192   _comp_ids.emplace_back(iSRC, compid);
0193 }
0194 
0195 // same as above, but add whole vector
0196 void Jetv2::insert_comp(Jet::TYPE_comp_vec& added)
0197 {
0198   _is_sorted = false;
0199   _comp_ids.insert(_comp_ids.end(), added.begin(), added.end());
0200 }
0201 void Jetv2::insert_comp(Jet::TYPE_comp_vec& added, bool /*skip_nosort_flag_set*/)
0202 {
0203   _comp_ids.insert(_comp_ids.end(), added.begin(), added.end());
0204 }
0205 
0206 void Jetv2::ensure_sorted()
0207 {
0208   if (!_is_sorted)
0209   {
0210     std::sort(_comp_ids.begin(), _comp_ids.end(), CompareSRC());
0211     _is_sorted = true;
0212   }
0213 }
0214 
0215 Jetv2::ITER_comp_vec Jetv2::comp_begin(Jet::SRC iSRC)
0216 {
0217   ensure_sorted();
0218   return std::lower_bound(_comp_ids.begin(), _comp_ids.end(), iSRC, CompareSRC());
0219 }
0220 
0221 Jetv2::ITER_comp_vec Jetv2::comp_end(Jet::SRC iSRC)
0222 {
0223   ensure_sorted();
0224   return std::upper_bound(_comp_ids.begin(), _comp_ids.end(), iSRC, CompareSRC());
0225 }
0226 
0227 void Jetv2::msg_dep_fn(const std::string& fn_name) 
0228 {
0229   std::cout << " warning: Method Jet::" << fn_name << "() deprecated in Jetv2" << std::endl;
0230 }
0231 
0232 bool Jetv2::has_property(Jet::PROPERTY /*prop_id*/) const
0233 {
0234   msg_dep_fn("has_property");
0235   return false;
0236 }
0237 
0238 // float Jetv2::get_property(Jet::PROPERTY /*prop_id*/) const {
0239 //     msg_dep_fn("get_property");
0240 //     return std::numeric_limits<float>::quiet_NaN();
0241 // }
0242 
0243 // void Jetv2::set_property(Jet::PROPERTY /**/, float /**/) {
0244 //     msg_dep_fn("set_property");
0245 // }
0246 
0247 void Jetv2::print_property(std::ostream& /**/) const
0248 {
0249   msg_dep_fn("print_property");
0250 }
0251 
0252 bool Jetv2::empty_comp() const
0253 {
0254   msg_dep_fn("empty_comp");
0255   return true;
0256 }
0257 
0258 size_t Jetv2::count_comp(Jet::SRC /**/) const
0259 {
0260   msg_dep_fn("count_comp");
0261   return 0;
0262 }
0263 
0264 Jet::ConstIter Jetv2::begin_comp() const
0265 {
0266   msg_dep_fn("begin_comp");
0267   return Jet::begin_comp();
0268 }
0269 Jet::ConstIter Jetv2::lower_bound_comp(Jet::SRC /**/) const
0270 {
0271   msg_dep_fn("lower_bound_comp");
0272   return Jet::lower_bound_comp(Jet::SRC::VOID);
0273 }
0274 Jet::ConstIter Jetv2::upper_bound_comp(Jet::SRC /**/) const
0275 {
0276   msg_dep_fn("upper_bound_comp");
0277   return Jet::upper_bound_comp(Jet::SRC::VOID);
0278 }
0279 Jet::ConstIter Jetv2::find(Jet::SRC /**/) const
0280 {
0281   msg_dep_fn("find");
0282   return Jet::find(Jet::SRC::VOID);
0283 }
0284 Jet::ConstIter Jetv2::end_comp() const
0285 {
0286   msg_dep_fn("end_comp");
0287   return Jet::end_comp();
0288 }
0289 Jet::Iter Jetv2::begin_comp()
0290 {
0291   msg_dep_fn("begin_comp");
0292   return Jet::begin_comp();
0293 }
0294 Jet::Iter Jetv2::lower_bound_comp(Jet::SRC /**/)
0295 {
0296   msg_dep_fn("lower_bound_comp");
0297   return Jet::lower_bound_comp(Jet::SRC::VOID);
0298 }
0299 Jet::Iter Jetv2::upper_bound_comp(Jet::SRC /**/)
0300 {
0301   msg_dep_fn("upper_bound_comp");
0302   return Jet::upper_bound_comp(Jet::SRC::VOID);
0303 }
0304 Jet::Iter Jetv2::find(Jet::SRC /**/)
0305 {
0306   msg_dep_fn("find");
0307   return Jet::find(Jet::SRC::VOID);
0308 }
0309 Jet::Iter Jetv2::end_comp()
0310 {
0311   msg_dep_fn("end_comp");
0312   return Jet::end_comp();
0313 }
0314 size_t Jetv2::erase_comp(Jet::SRC /**/)
0315 {
0316   msg_dep_fn("erase_comp");
0317   return 0;
0318 }
0319 void Jetv2::erase_comp(Jet::Iter /*iter*/)
0320 {
0321   msg_dep_fn("erase_comp");
0322 }
0323 void Jetv2::erase_comp(Jet::Iter /*first*/, Jet::Iter /*last*/)
0324 {
0325   msg_dep_fn("erase_comp");
0326 }