ATLAS Offline Software
MassRangeFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 MassRangeFilter::MassRangeFilter(const std::string& name, ISvcLocator* pSvcLocator)
8  : GenFilter(name,pSvcLocator)
9 {
10  declareProperty("PtCut",m_Ptmin = 10000.);
11  declareProperty("PtCut2",m_Ptmin2 = 10000.);
12  declareProperty("EtaCut",m_EtaRange = 10.);
13  declareProperty("EtaCut2",m_EtaRange2 = 10.);
14  declareProperty("InvMassMin",m_InvMassMin=0.);
15  declareProperty("InvMassMax",m_InvMassMax=14000000.);
16  declareProperty("PartId",m_PartId=13);
17  declareProperty("PartId2",m_PartId2=13);
18  declareProperty("PartStatus",m_PartStatus=1);
19 }
20 
22  ATH_MSG_INFO(" PtCut " << m_Ptmin <<
23  " PtCut2 " << m_Ptmin2 <<
24  " EtaCut " << m_EtaRange <<
25  " EtaCut2 " << m_EtaRange2 <<
26  " InvMassMin " << m_InvMassMin <<
27  " InvMassMax " << m_InvMassMax <<
28  " PartId " << m_PartId <<
29  " PartId2 " << m_PartId2 <<
30  " PartStatus " << m_PartStatus);
31  return StatusCode::SUCCESS;
32 }
33 
35  double invMassMax = 0.;
36  bool samePDGID = (std::abs(m_PartId) == std::abs(m_PartId2));
37  for (McEventCollection::const_iterator itr = events()->begin(); itr != events()->end(); ++itr) {
38  const HepMC::GenEvent* genEvt = *itr;
39  auto genEvt_particles_begin=HepMC::begin(*genEvt);
40  auto genEvt_particles_end=HepMC::end(*genEvt);
41  for (auto pitr1 = genEvt_particles_begin; pitr1 != genEvt_particles_end; ++pitr1) {
42  if ((*pitr1)->status() != m_PartStatus ) continue; //status of the particle
43  if (std::abs((*pitr1)->pdg_id()) != std::abs(m_PartId) ) continue; //PDG ID selection
44  if ((*pitr1)->momentum().perp() < m_Ptmin ) continue; // pT cut
45  if (std::abs((*pitr1)->momentum().pseudoRapidity()) > m_EtaRange) continue; //eta cut
46  auto pitr2 = genEvt_particles_begin;
47  if (samePDGID) {
48  pitr2 = pitr1;
49  pitr2++;
50  }
51  for (; pitr2 != genEvt_particles_end; ++pitr2) {
52  if (pitr1 == pitr2) continue; //if the pointers are the same
53  if ((*pitr2)->status() != m_PartStatus) continue; //status of the particle
54  if (std::abs((*pitr2)->pdg_id()) != std::abs(m_PartId2)) continue; //PDG ID selection
55  if ((*pitr2)->momentum().perp() < m_Ptmin2) continue; // pT cut
56  if (std::abs((*pitr2)->momentum().pseudoRapidity()) > m_EtaRange2) continue;//eta cut
57 
58  HepMC::FourVector vec((*pitr1)->momentum().px() + (*pitr2)->momentum().px(),
59  (*pitr1)->momentum().py() + (*pitr2)->momentum().py(),
60  (*pitr1)->momentum().pz() + (*pitr2)->momentum().pz(),
61  (*pitr1)->momentum().e() + (*pitr2)->momentum().e());
62  double invMass = vec.m();
63  invMassMax = std::max(invMass, invMassMax);
64  } //pitr2
65  } //pitr1
66  } //McEventCollection
67 
68  setFilterPassed(m_InvMassMin <= invMassMax && invMassMax < m_InvMassMax);
69  return StatusCode::SUCCESS;
70 }
MassRangeFilter.h
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
max
#define max(a, b)
Definition: cfImp.cxx:41
P4Helpers::invMass
double invMass(const I4Momentum &pA, const I4Momentum &pB)
invariant mass from two I4momentum references
Definition: P4Helpers.h:239
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
python.DataFormatRates.events
events
Definition: DataFormatRates.py:105
MassRangeFilter::m_PartId
int m_PartId
Definition: MassRangeFilter.h:38
MassRangeFilter::m_Ptmin
double m_Ptmin
Definition: MassRangeFilter.h:32
MassRangeFilter::MassRangeFilter
MassRangeFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MassRangeFilter.cxx:7
HepMC::end
GenEvent::particle_iterator end(HepMC::GenEvent &e)
Definition: GenEvent.h:499
CxxUtils::vec
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
Definition: vec.h:207
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MassRangeFilter::m_InvMassMax
double m_InvMassMax
Definition: MassRangeFilter.h:37
MassRangeFilter::filterEvent
virtual StatusCode filterEvent()
Definition: MassRangeFilter.cxx:34
MassRangeFilter::m_InvMassMin
double m_InvMassMin
Definition: MassRangeFilter.h:36
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MassRangeFilter::m_Ptmin2
double m_Ptmin2
Definition: MassRangeFilter.h:33
MassRangeFilter::m_EtaRange
double m_EtaRange
Definition: MassRangeFilter.h:34
HepMC::begin
GenEvent::particle_iterator begin(HepMC::GenEvent &e)
Definition: GenEvent.h:498
MassRangeFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: MassRangeFilter.cxx:21
MassRangeFilter::m_EtaRange2
double m_EtaRange2
Definition: MassRangeFilter.h:35
MassRangeFilter::m_PartStatus
int m_PartStatus
Definition: MassRangeFilter.h:40
MassRangeFilter::m_PartId2
int m_PartId2
Definition: MassRangeFilter.h:39