ATLAS Offline Software
ParentChildFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 ParentChildFilter::ParentChildFilter(const std::string& name, ISvcLocator* pSvcLocator)
8  : GenFilter(name,pSvcLocator)
9 {
10  declareProperty("PDGParent",m_PDGParent);
11  declareProperty("PtMinParent",m_PtMinParent = 0.);
12  declareProperty("PtMaxParent",m_PtMaxParent = 1e9);
13  declareProperty("MassMinParent",m_MassMinParent = -1e9);
14  declareProperty("MassMaxParent",m_MassMaxParent = 1e9);
15  declareProperty("EtaRangeParent",m_EtaRangeParent = 10.0);
16  declareProperty("EtaMinParent",m_EtaMinParent = 0.);
17  declareProperty("RapidityRangeParent",m_RapidityRangeParent = 10.0);
18  declareProperty("RapidityMinParent",m_RapidityMinParent = 0.);
19  declareProperty("PDGChild",m_PDGChild);
20  declareProperty("PtMinChild",m_PtMinChild = 0.);
21  declareProperty("EtaRangeChild",m_EtaRangeChild = 10.0);
22 }
23 
24 
26  if (m_PDGParent.size() == 0) ATH_MSG_ERROR("PDGParent[] not set ");
27  if (m_PDGChild.size() == 0) ATH_MSG_ERROR("PDGChild[] not set ");
28  for (int i=0; i < int(m_PDGParent.size()); i++) ATH_MSG_INFO("PDGParent["<<i<<"] = " << m_PDGParent[i]);
29  ATH_MSG_INFO("PtMinParent = " << m_PtMinParent);
30  ATH_MSG_INFO("PtMaxParent = " << m_PtMaxParent);
31  ATH_MSG_INFO("MassMinParent = " << m_MassMinParent);
32  ATH_MSG_INFO("MassMaxParent = " << m_MassMaxParent);
33  ATH_MSG_INFO("EtaRangeParent = " << m_EtaRangeParent);
34  ATH_MSG_INFO("EtaMinParent = " << m_EtaMinParent);
35  ATH_MSG_INFO("RapidityRangeParent = " << m_RapidityRangeParent);
36  ATH_MSG_INFO("RapidityMinParent = " << m_RapidityMinParent);
37 
38  for (int i=0; i < int(m_PDGChild.size()); i++) ATH_MSG_INFO("PDGChild["<<i<<"] = " << m_PDGChild[i]);
39  ATH_MSG_INFO("PtMinChild = " << m_PtMinChild);
40  ATH_MSG_INFO("EtaRangeChild = " << m_EtaRangeChild);
41  return StatusCode::SUCCESS;
42 }
43 
44 
46  for (McEventCollection::const_iterator itr = events()->begin(); itr != events()->end(); ++itr) {
47  const HepMC::GenEvent* genEvt = (*itr);
48  for (const auto& pitr: *genEvt) {
49  int okPDGParent = 0;
50  for (int i = 0; i < int(m_PDGParent.size()); i++) if (std::abs(pitr->pdg_id()) == m_PDGParent[i]) okPDGParent=1;
51  if ( (m_PDGParent[0] == 0) || (okPDGParent
52  && (pitr->momentum().perp() >= m_PtMinParent)
53  && (pitr->momentum().perp() < m_PtMaxParent)
54  && (pitr->momentum().m() >= m_MassMinParent)
55  && (pitr->momentum().m() < m_MassMaxParent)
56  && (std::abs(pitr->momentum().eta()) > m_EtaMinParent)
57  && (std::abs(pitr->momentum().eta()) < m_EtaRangeParent)
58 #ifdef HEPMC3
59  && (std::abs(pitr->momentum().rap()) > m_RapidityMinParent)
60  && (std::abs(pitr->momentum().rap()) < m_RapidityRangeParent))) {
61 #else
62  && (std::abs(getRapidity(pitr)) > m_RapidityMinParent)
63  && (std::abs(getRapidity(pitr)) < m_RapidityRangeParent))) {
64 #endif
65  // Check if has end_vertex (skips initial protons)
66  if (!pitr->end_vertex()) continue;
67  // Child
68  for (auto thisChild: *(pitr->end_vertex())) {
69  int okPDGChild = 0;
70  for (int i=0; i < int(m_PDGChild.size()); i++) if (std::abs(thisChild->pdg_id()) == m_PDGChild[i]) okPDGChild=1;
71  if ( thisChild->pdg_id() != pitr->pdg_id()
72  && (m_PDGChild[0] == 0 || okPDGChild)
73  && thisChild->momentum().perp() > m_PtMinChild
74  && std::abs(thisChild->momentum().eta()) < m_EtaRangeChild ) {
75  return StatusCode::SUCCESS;
76  }
77  }
78  }
79  }
80  }
81  setFilterPassed(false);
82  return StatusCode::SUCCESS;
83 }
ParentChildFilter::getRapidity
double getRapidity(const HepMC::GenParticle *p) const
calculate the rapidity of a particle
Definition: ParentChildFilter.h:37
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
ParentChildFilter::m_PDGParent
std::vector< int > m_PDGParent
Definition: ParentChildFilter.h:20
ParentChildFilter::m_EtaMinParent
double m_EtaMinParent
Definition: ParentChildFilter.h:26
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
ParentChildFilter::m_MassMaxParent
double m_MassMaxParent
Definition: ParentChildFilter.h:24
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
ParentChildFilter::m_PDGChild
std::vector< int > m_PDGChild
Definition: ParentChildFilter.h:29
ParentChildFilter::m_EtaRangeChild
double m_EtaRangeChild
Definition: ParentChildFilter.h:31
python.DataFormatRates.events
events
Definition: DataFormatRates.py:105
ParentChildFilter::filterEvent
virtual StatusCode filterEvent()
Definition: ParentChildFilter.cxx:45
ParentChildFilter::m_PtMinChild
double m_PtMinChild
Definition: ParentChildFilter.h:30
ParentChildFilter::m_PtMinParent
double m_PtMinParent
Definition: ParentChildFilter.h:21
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
ParentChildFilter::m_PtMaxParent
double m_PtMaxParent
Definition: ParentChildFilter.h:22
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ParentChildFilter::m_RapidityRangeParent
double m_RapidityRangeParent
Definition: ParentChildFilter.h:27
ParentChildFilter.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ParentChildFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: ParentChildFilter.cxx:25
ParentChildFilter::ParentChildFilter
ParentChildFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: ParentChildFilter.cxx:7
ParentChildFilter::m_MassMinParent
double m_MassMinParent
Definition: ParentChildFilter.h:23
ParentChildFilter::m_RapidityMinParent
double m_RapidityMinParent
Definition: ParentChildFilter.h:28
ParentChildFilter::m_EtaRangeParent
double m_EtaRangeParent
Definition: ParentChildFilter.h:25