ATLAS Offline Software
Public Types | Public Member Functions | Static Public Member Functions | Protected Attributes | List of all members
jet::JetConstituentFiller Class Reference

#include <JetConstituentFiller.h>

Collaboration diagram for jet::JetConstituentFiller:

Public Types

typedef std::vector< std::string > NameList
 

Public Member Functions

 JetConstituentFiller (bool isTrig=false)
 
int extractConstituents (xAOD::Jet &jet, const NameList *pghostlabs, const fastjet::PseudoJet *ppj=0)
 Build and fill constituents of jet from its PseudoJet (or from ppj) Returns the number of pseudojet constituents without user info or < 0 for error. More...
 
int extractConstituents (xAOD::Jet &jet, const fastjet::PseudoJet *ppj=0)
 Build and fill constituents of jet from its PseudoJet (or from ppj) Returns the number of pseudojet constituents without user info or < 0 for error. More...
 

Static Public Member Functions

static PseudoJetVector constituentPseudoJets (const xAOD::Jet &jet, bool ignoreGhosts=true, bool requireJetStructure=false)
 Returns the jet's constituents as a vector of PseudoJet if ignoreGhosts==true, ghost constituents are removed from the output. More...
 

Protected Attributes

bool m_isTrigger
 

Detailed Description

Definition at line 27 of file JetConstituentFiller.h.

Member Typedef Documentation

◆ NameList

typedef std::vector<std::string> jet::JetConstituentFiller::NameList

Definition at line 33 of file JetConstituentFiller.h.

Constructor & Destructor Documentation

◆ JetConstituentFiller()

jet::JetConstituentFiller::JetConstituentFiller ( bool  isTrig = false)
inline

Definition at line 31 of file JetConstituentFiller.h.

31 :m_isTrigger(isTrig){}

Member Function Documentation

◆ constituentPseudoJets()

PseudoJetVector JetConstituentFiller::constituentPseudoJets ( const xAOD::Jet jet,
bool  ignoreGhosts = true,
bool  requireJetStructure = false 
)
static

Returns the jet's constituents as a vector of PseudoJet if ignoreGhosts==true, ghost constituents are removed from the output.

Definition at line 169 of file JetConstituentFiller.cxx.

169  {
170 
171  static const SG::AuxElement::Accessor<const fastjet::PseudoJet*> pjAccessor("PseudoJet");
172  const fastjet::PseudoJet* jet_pj = nullptr;
173  if(pjAccessor.isAvailable(jet)) jet_pj = pjAccessor(jet);
174 
175  PseudoJetVector constituents;
176 
177  if(jet_pj && !ignoreGhosts ){ // Retrieve constituents from the PseudoJet
178  constituents = jet_pj->constituents(); // all constituents, including ghosts
179  // Removed block for (existing jet_pt and ignoreGhosts), because
180  // in the PseudoJetContainer model, the constituent user info is
181  // not attached, and hence it's not possible to know if a pj is
182  // ghost or constituent.
183  } else { // no PseudoJet in jet or need to reject ghosts. Build them from constituents.
184 
185  // For SoftDrop variables like zg, rg, the structure of the jet is needed and
186  // constituents have to be retrieved from the Pseudojet
187  if(jet_pj && requireJetStructure){
188  PseudoJetVector constituents_all = jet_pj->constituents(); // all constituents, including ghosts
189  //Filter out ghosts before calculating variables (comparison to constituents)
190  xAOD::JetConstituentVector constituents_tmp = jet.getConstituents();
191  constituents.reserve( jet.numConstituents() );
192  for(size_t i = 0; i < constituents_all.size(); i++){
193  for(size_t j = 0; j < constituents_tmp.size(); j++){
194  if(std::abs((constituents_all[i].px()-constituents_tmp[j].Px())/constituents_tmp[j].Px()) < 0.0001 &&
195  std::abs((constituents_all[i].py()-constituents_tmp[j].Py())/constituents_tmp[j].Py()) < 0.0001 &&
196  std::abs((constituents_all[i].pz()-constituents_tmp[j].Pz())/constituents_tmp[j].Pz()) < 0.0001){
197  constituents.push_back(constituents_all[i]);
198  break;
199  }
200  }
201  }
202  }
203  else{
204  xAOD::JetConstituentVector constituents_tmp = jet.getConstituents();
205  constituents.reserve( jet.numConstituents() );
206  for(size_t i = 0; i < constituents_tmp.size(); i++){
207  constituents.emplace_back( constituents_tmp[i].Px(), constituents_tmp[i].Py(), constituents_tmp[i].Pz(), constituents_tmp[i].E() );
208  }
209  }
210  }
211  return constituents;
212 }

◆ extractConstituents() [1/2]

int JetConstituentFiller::extractConstituents ( xAOD::Jet jet,
const fastjet::PseudoJet *  ppj = 0 
)

Build and fill constituents of jet from its PseudoJet (or from ppj) Returns the number of pseudojet constituents without user info or < 0 for error.

If the jet does not have an associated pseudojet, then the last argument is used in its place. This is for backwards compatability with code that targets release 19.1

Definition at line 163 of file JetConstituentFiller.cxx.

163  {
164  return extractConstituents(jet, nullptr, ppj2);
165 }

◆ extractConstituents() [2/2]

int JetConstituentFiller::extractConstituents ( xAOD::Jet jet,
const NameList pghostlabs,
const fastjet::PseudoJet *  ppj = 0 
)

Build and fill constituents of jet from its PseudoJet (or from ppj) Returns the number of pseudojet constituents without user info or < 0 for error.

If the jet does not have an associated pseudojet, then the last argument is used in its place. The second argments holds the list of ghost association names.

Definition at line 40 of file JetConstituentFiller.cxx.

42  {
43 
44  static const SG::AuxElement::Accessor<const fastjet::PseudoJet*> pjAccessor("PseudoJet");
45  const fastjet::PseudoJet* ppseudojet = nullptr;
46  if(pjAccessor.isAvailable(jet)) ppseudojet = pjAccessor(jet);
47 
48  if ( ppseudojet == nullptr ) {
49  ppseudojet = ppj2;
50  }
51  if ( ppseudojet == nullptr ) return -1;
52  int nbad = 0;
53  const PseudoJetVector& cons = ppseudojet->constituents();
55  MuonSegmentMap outms;
56  PtMap ptout;
57  ParTypeVector partypes;
58  const LabelIndex* pli = nullptr;
59  for ( PseudoJetVector::const_iterator icon=cons.begin(); icon!=cons.end(); ++icon ) {
60  if ( icon->has_user_info<IConstituentUserInfo>() ) {
61  const IConstituentUserInfo& cui = icon->user_info<IConstituentUserInfo>();
62  // Initialize with the first constituent.
63  if ( pli == nullptr ) {
64  pli = cui.labelMap();
65  if ( pli == nullptr ) return -2;
66  unsigned int maxli = pli->size() + 1; // +1 because LabelIndex starts at 1;
67  out.resize(maxli); // +1 because LabelIndex starts at 1
68  outms.resize(maxli);
69  for ( unsigned int ili=0; ili<maxli; ++ili ) {
70  ptout.push_back(0.0);
71  }
72  for ( ParType& partype : partypes ) partype = UNDEF;
73  for ( unsigned int idx=0; idx<maxli; ++idx ) {
74  std::string lab = pli->label(idx);
75  if ( lab.empty() ) {
76  partypes.push_back(UNDEF);
77  if ( idx ) return -3;
78  } else if ( lab.find("MuonSegment") != std::string::npos ) {
79  partypes.push_back(MUSEG);
80  } else {
81  partypes.push_back(IPART);
82  }
83  }
84  }
85  if ( pli != cui.labelMap() ) return -4;
86  const IParticle* ppar = cui.particle();
87  const MuonSegment* pms = nullptr;
88  // If this is not an IParticle, find the full type.
89  unsigned int icui = cui.index();
90  ParType partype = partypes[icui];
91  if ( ppar == nullptr ) {
92  const MuonSegmentCUI* pmscui = dynamic_cast<const MuonSegmentCUI*>(&cui);
93  if ( pmscui == nullptr ) return -5;
94  pms = pmscui->object();
95  if ( partype != MUSEG ) return -6;
96  } else {
97  if ( partype != IPART ) return -7;
98  }
99  Label lab = cui.label();
100  // Add to constituent list or associated object list.
101  if ( ! cui.isGhost() ) {
102  if (!ppar) {
103  ++nbad;
104  }
105  else {
106  jet.addConstituent(ppar);
107  jet.setConstituentsSignalState( cui.constitScale() );
108  }
109  } else {
110  if ( partype == MUSEG ) {
111  outms[icui].push_back(pms);
112  } else if ( partype == IPART ) {
113  out[icui].push_back(ppar);
114  }
115  }
116  } else {
117  ++nbad;
118  }
119  }
120 
121  // Set ghost associated particles:
122  if (pli){
123  for ( size_t i=1; i<out.size(); ++i ) {
124  if ( pghostlabs) {
125  const NameList& ghostlabs = *pghostlabs;
126  if ( find(ghostlabs.begin(), ghostlabs.end(), pli->label(i)) == ghostlabs.end() ) {
127  nbad += out[i].size();
128  continue;
129  }
130  }
131  ParType& partype = partypes[i];
132  std::string cname = pli->label(i) + "Count";
133  std::string ptname = pli->label(i) + "Pt";
134  // Check if this is in the parent jet
135  int count_test; // dummy var to retrieve into -- we don't care about the value
136  const static SG::AuxElement::ConstAccessor<ElementLink<xAOD::JetContainer> > cacc_parent("Parent");
137  if(!m_isTrigger) {
138  if(cacc_parent.isAvailable(jet) && cacc_parent(jet).isValid()) {
139  if(!(*cacc_parent(jet))->getAttribute(cname,count_test)) {
140  nbad += out[i].size(); // Skip if the parent does not have this
141  continue;
142  }
143  }
144  }
145  if ( partype == MUSEG ) {
146  // Record associated muons.
147  jet.setAssociatedObjects(pli->label(i) , outms[i]);
148  jet.setAttribute<int>(cname, outms[i].size());
149  } else if ( partype == IPART ) {
150  // Record associated particles.
151  jet.setAssociatedObjects(pli->label(i), out[i]);
152  jet.setAttribute<int>(cname, out[i].size());
153  jet.setAttribute<float>(ptname, ptout[i]);
154  if ( ! outms[i].empty() ) return -9;
155  } else {
156  return -10;
157  }
158  }
159  }
160  return nbad;
161 }

Member Data Documentation

◆ m_isTrigger

bool jet::JetConstituentFiller::m_isTrigger
protected

Definition at line 57 of file JetConstituentFiller.h.


The documentation for this class was generated from the following files:
Label
IndexedConstituentUserInfo::Label Label
Definition: IndexedConstituentUserInfo.cxx:11
test_pyathena.px
px
Definition: test_pyathena.py:18
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:138
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
MuonSegmentMap
std::vector< MuonSegmentVector > MuonSegmentMap
Definition: JetConstituentFiller.cxx:29
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
xAOD::JetConstituentVector::size
size_t size() const
number of constituents
Definition: JetConstituentVector.cxx:102
ParticleMap
std::vector< ParticleVector > ParticleMap
Definition: JetConstituentFiller.cxx:22
TrigConf::JetWindowSize::UNDEF
@ UNDEF
Definition: TriggerThresholdValue.h:17
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
jet::IConstituentUserInfo::particle
virtual const xAOD::IParticle * particle() const =0
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:878
jet::JetConstituentFiller::extractConstituents
int extractConstituents(xAOD::Jet &jet, const NameList *pghostlabs, const fastjet::PseudoJet *ppj=0)
Build and fill constituents of jet from its PseudoJet (or from ppj) Returns the number of pseudojet c...
Definition: JetConstituentFiller.cxx:41
xAOD::MuonSegment
MuonSegment_v1 MuonSegment
Reference the current persistent version:
Definition: Event/xAOD/xAODMuon/xAODMuon/MuonSegment.h:13
jet::IndexedTConstituentUserInfo
Definition: IndexedTConstituentUserInfo.h:31
jet::JetConstituentFiller::m_isTrigger
bool m_isTrigger
Definition: JetConstituentFiller.h:57
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
lumiFormat.i
int i
Definition: lumiFormat.py:85
jet::IConstituentUserInfo::isGhost
virtual bool isGhost() const
Returns true if this constituent is a ghost.
Definition: IConstituentUserInfo.cxx:26
jet::IConstituentUserInfo::labelMap
virtual const LabelIndex * labelMap() const
Definition: IConstituentUserInfo.cxx:20
jet::IndexedTConstituentUserInfo::object
const T * object() const
Amg::pz
@ pz
Definition: GeoPrimitives.h:40
jet::IConstituentUserInfo::index
virtual Index index() const
Definition: IConstituentUserInfo.cxx:14
jet::IConstituentUserInfo::label
virtual Label label() const =0
jet::IConstituentUserInfo::constitScale
virtual xAOD::JetConstitScale constitScale() const
Return the constituent scale used to build the PseudoJet.
Definition: IConstituentUserInfo.cxx:32
EventPicking.cname
cname
Definition: EventPicking.py:137
Amg::py
@ py
Definition: GeoPrimitives.h:39
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
PseudoJetVector
std::vector< fastjet::PseudoJet > PseudoJetVector
Definition: JetConstituentFiller.cxx:17
columnar::empty
bool empty() const noexcept
Definition: ObjectRange.h:167
NameList
IJetConstituentsRetriever::NameList NameList
Definition: JetConstituentsRetriever.cxx:22
jet::IConstituentUserInfo
Definition: IConstituentUserInfo.h:26
jet::LabelIndex::size
Index size() const
Number of label stored in this map. WARNING the index starts at 1, so range is [1....
Definition: LabelIndex.cxx:76
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
ParTypeVector
std::vector< ParType > ParTypeVector
Definition: JetConstituentFiller.cxx:36
xAOD::JetConstituentVector
A vector of jet constituents at the scale used during jet finding.
Definition: JetConstituentVector.h:117
PtMap
std::vector< double > PtMap
Definition: JetConstituentFiller.cxx:23
IParticle
Definition: Event/EventKernel/EventKernel/IParticle.h:43