12#include "fastjet/PseudoJet.hh"
19using fastjet::PseudoJet;
26 const std::vector<PseudoJet> & vecPJ,
42 vecPJ.back().user_index(),
49 const std::vector<PseudoJet>& inConstits)
const
56 std::map<const IConstituentExtractor*, std::vector<int>> sorter;
64 sorter.emplace(er.m_e.get(), std::vector<int>{});
69 sorter.emplace(e.get(), std::vector<int>{});
75 for (
const auto& pj : inConstits){
77 int pj_ind = pj.user_index();
81 if (pj_ind == -1) {
continue;}
91 return pj_ind >= r.m_lo and pj_ind <= r.m_hi;});
95 sorter[(*e).m_e.get()].push_back(pj_ind - (*e).m_lo);
100 for(
const auto& s : sorter){s.first -> addToJet(
jet, s.second);}
109 std::vector<PseudoJet> inConstituents = finalPJ.constituents();
115 std::vector<PseudoJet> allInConstituents = finalPJ.constituents();
116 std::vector<PseudoJet> byVertexConstituents;
117 for (
PseudoJet& constituent: allInConstituents){
123 if (originVertex == vertex){
124 byVertexConstituents.emplace_back(constituent);
129 byVertexConstituents.emplace_back(constituent);
151 std::transform(other->m_extractorRanges.begin(),
152 other->m_extractorRanges.end(),
160 std::transform(other->m_allConstituents.begin(),
161 other->m_allConstituents.end(),
163 [offset](fastjet::PseudoJet pj){
164 pj.set_user_index(pj.user_index() + offset);return pj;}
167 for(
const auto &e : other->m_emptyExtractors){
m_emptyExtractors.emplace(e->clone());}
173 std::ostringstream oss{
"PseudoJetContainer at: ", std::ios::ate};
175 <<
"\ndump levels: "<< level <<
" " << extLevel <<
'\n'
178 oss <<
"(" << er.m_lo <<
"," <<er.m_hi <<
"), ";
185 oss <<
"\n Extractor dump: \n";
187 oss <<
"Extractor at [" ;
190 oss << er.m_e->toString(extLevel) <<
'\n';
200 std::ostringstream oss{
"PseudoJetContainer at: ", std::ios::ate};
201 oss <<
"\n PseudoJet energies\n";
203 oss <<
"pseudojet user ind " << p.user_index()
204 <<
" E " << p.e() <<
" " << p.eta() <<
'\n';
216 oss(
"PseudoJetContainer checkInvariants called from: ",
222 oss <<
"No extractors, but pseudojets present";
231 if (ex.m_lo < 0 or ex.m_lo > ex.m_hi){
232 oss <<
"bad extractor limits: " << ex.m_lo <<
" " << ex.m_hi;
241 oss <<
" Illegal extractor range limit " << uExtCount;
245 std::size_t uuExtCount = uExtCount;
253 if (npj > uuExtCount + 1){
254 oss <<
" Mismatch between pseudo jet count/upper Extractor limit "
255 << npj <<
"/" << uuExtCount;
263 oss <<
" first pseudojet does not have index 0 " << firstInd;
269 for (std::size_t i = 0; i < nent-1; ++i){
272 if (cur.m_hi != next.m_lo - 1){
273 oss <<
"Hi limit for extractor " << i
274 <<
" != low limit for extractor " << i+1;
287 oss <<
"PseudoJet.e() fails of PJ in m_allConstituents";
293 if (!((er.m_e)->checkIntegrity())){
294 oss <<
"IConstituentExtractor fails integrity test";
306 const std::string& from)
const{
316 oss(
"PseudoJetContainer checkPseudoJetVector called from: ",
321 oss <<
"Empty pseudojet vector " ;
325 oss <<
"PseudoJetVector energy dump:\n";
326 std::vector<float> energies;
327 energies.reserve(v.size());
328 std::transform(v.begin(),
330 std::back_inserter(energies),
334 oss << formatter(energies);
338 if (v[0].user_index() < 0){
340 oss <<
"First pj has index < 0: " << v[0].user_index();
343 std::vector<int> indices(v.size());
344 std::transform(v.begin(),
346 std::back_inserter(indices),
347 [](
const PseudoJet & p){return p.user_index();});
349 if(!std::is_sorted(indices.begin(), indices.end())){
350 oss <<
"Pseudojets out of order ";
354 if(ok){oss << v.size() <<
" checked ok";}
361 const std::string& from)
const {
366 oss(
"PseudoJetContainer checkInConstituents called from: ",
369 oss << v.size() <<
" entries\n";
371 std::vector<double> energies;
372 energies.reserve(v.size());
373 std::transform(v.begin(),
375 std::back_inserter(energies),
380 oss << formatter(energies);
382 for(
const auto& pj: v){
383 if(pj.user_index() == -1){oss <<
"PJ index -1, E() " << pj.E() <<
'\n';}
386 std::vector<int> indices;
387 indices.reserve(v.size());
388 std::transform(v.begin(),
390 std::back_inserter(indices),
391 [](
const PseudoJet & p){return p.user_index();});
393 oss <<
"PseudoJet indices\n";
394 oss << formatter(indices);
397 std::map<int, int> counter;
402 for (
auto ind : indices){
404 if (ind == -1){
continue;}
405 if (ind < lo or ind > hi){++(counter[ind]);}
409 bool bad = !counter.empty();
412 oss <<
"Out of range values[counts]: ";
414 for(
auto ent: counter){oss << ent.first <<
"/" << ent.second <<
'\n';}
415 oss <<
"Extractor ranges: \n";
417 oss << er.m_lo <<
" " << er.m_hi <<
'\n';
430 auto errMsg = oss.str();
433 std::cerr << errMsg <<
'\n';
434 throw std::runtime_error(errMsg);
std::ostream & operator<<(std::ostream &os, const PseudoJetContainer &c)
std::set< std::unique_ptr< const IConstituentExtractor > > m_emptyExtractors
bool extractByVertexConstituents(xAOD::Jet &jet, const PseudoJet &finalPJ, const xAOD::Vertex *vertex) const
std::vector< PseudoJet > m_allConstituents
bool checkInConstituents(const std::vector< PseudoJet > &, const std::string &) const
bool checkInvariants(const std::string &) const
const std::vector< PseudoJet > * casVectorPseudoJet() const
std::vector< ExtractorRange > m_extractorRanges
void append(const PseudoJetContainer *)
fastjet::PseudoJet PseudoJet
bool bad_invariants_exit(const std::ostringstream &) const
std::string dumpPseudoJets() const
std::string toString(int level, int extLevel=0) const
bool checkPseudoJetVector(const std::vector< PseudoJet > &, const std::string &) const
bool extractConstituents(xAOD::Jet &, const std::vector< PseudoJet > &) const
const xAOD::Vertex * vertex() const
Returns the associated vertex if this constit is a track. Else returns null. */.
Jet_v1 Jet
Definition of the current "jet version".
Vertex_v1 Vertex
Define the latest version of the vertex class.