ATLAS Offline Software
Loading...
Searching...
No Matches
BSignalFilter Class Reference

#include <BSignalFilter.h>

Inheritance diagram for BSignalFilter:
Collaboration diagram for BSignalFilter:

Public Member Functions

 BSignalFilter (const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode filterFinalize ()
virtual StatusCode filterEvent (const EventContext &ctx)
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
bool filterPassed (const EventContext &ctx) const
void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Event loop algorithm methods: not to be overloaded
StatusCode initialize ()
StatusCode execute (const EventContext &ctx)
 Execute method.
StatusCode finalize ()
Gen-specific event loop methods: to be overloaded!
virtual StatusCode filterInitialize ()
Counters
int nPassed () const
int nFailed () const
int nNeeded () const
bool keepAll () const
Event collection accessors (const and non-const)
HepMC::GenEvent *event ATLAS_NOT_CONST_THREAD_SAFE ()
 Access the current signal event (first in the McEventCollection).
McEventCollection *events ATLAS_NOT_CONST_THREAD_SAFE ()
 Access the current event's McEventCollection.
const HepMC::GenEventevent_const (const EventContext &ctx) const
 Access the current signal event (const).
const McEventCollectionevents_const (const EventContext &ctx) const
 Access the current event's McEventCollection (const).
Particle data accessors
const ServiceHandle< IPartPropSvc > partPropSvc () const
 Access the particle property service.
const HepPDT::ParticleDataTable & particleTable () const
 Get a particle data table.
const HepPDT::ParticleDataTable & pdt () const
 Shorter alias to get a particle data table.
const HepPDT::ParticleData * particleData (int pid) const
 Access an element in the particle data table.
const EventContext & getContext () const
 Deprecated methods (use the ones with EventContext).
bool filterPassed () const
void setFilterPassed (bool state) const

Protected Member Functions

virtual bool isReEntrant () const override final
 Legacy algorithms are not thread-safe.
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Protected Attributes

Counters and requirements
int m_nPass
int m_nFail
int m_nNeeded
bool m_keepAll

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

void FindAllChildren (const HepMC::ConstGenParticlePtr &mother, std::string treeIDStr, bool fromFinalB, bool &foundSignal, bool &passedAllCuts, TLorentzVector &p1, TLorentzVector &p2, bool fromSelectedB, TLorentzVector &total_4mom) const
bool FinalStatePassedCuts (const HepMC::ConstGenParticlePtr &child) const
bool test_cuts (const double myPT, const double testPT, const double myEta, const double testEta) const
bool LVL1_Mu_Trigger (const HepMC::ConstGenParticlePtr &child) const
bool LVL2_eMu_Trigger (const HepMC::ConstGenParticlePtr &child) const
void PrintChild (const HepMC::ConstGenParticlePtr &child, const std::string &treeIDStr, const bool fromFinalB) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

bool m_cuts_f_e_on
bool m_cuts_f_mu_on
bool m_cuts_f_had_on
bool m_cuts_f_gam_on
bool m_cuts_f_K0_on
bool m_localLVL1MuonCutOn
bool m_localLVL2MuonCutOn
bool m_localLVL2ElectronCutOn
bool m_InvMass_switch
bool m_TotalInvMass_switch
double m_cuts_f_e_pT
double m_cuts_f_mu_pT
double m_cuts_f_had_pT
double m_cuts_f_gam_pT
double m_cuts_f_K0_pT
double m_cuts_f_e_eta
double m_cuts_f_mu_eta
double m_cuts_f_had_eta
double m_cuts_f_gam_eta
double m_cuts_f_K0_eta
double m_localLVL1MuonCutPT
double m_localLVL1MuonCutEta
double m_localLVL2MuonCutPT
double m_localLVL2MuonCutEta
double m_localLVL2ElectronCutPT
double m_localLVL2ElectronCutEta
double m_LVL1Counter
double m_LVL2Counter
double m_rejectedTrigger
double m_rejectedAll
int m_B_pdgid
int m_InvMass_PartId1
int m_InvMass_PartId2
double m_InvMass_PartFakeMass1
double m_InvMass_PartFakeMass2
double m_InvMassMin
double m_InvMassMax
double m_TotalInvMassMin
double m_TotalInvMassMax
int m_EventCnt
DataObjIDColl m_extendedExtraObjects
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Properties

ServiceHandle< IPartPropSvc > m_ppSvc {this, "PartPropSvc", "PartPropSvc"}
 Handle on the particle property service.
SG::ReadHandleKey< McEventCollectionm_mcevents_const { this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" }
 Const handle to the MC event collection.
std::string m_mcEventKey {}
 StoreGate key for the MC event collection (defaults to GEN_EVENT).
BooleanProperty m_mkMcEvent {this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"}
 Flag to determine if a new MC event collection should be made if it doesn't exist.

Detailed Description

Definition at line 23 of file BSignalFilter.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ BSignalFilter()

BSignalFilter::BSignalFilter ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 34 of file BSignalFilter.cxx.

34 :
35 GenFilter(name, pSvcLocator)
36{
37 // ** Declare the algorithm's properties **
38 declareProperty("LVL1MuonCutOn" , m_localLVL1MuonCutOn = false );
39 declareProperty("LVL2MuonCutOn" , m_localLVL2MuonCutOn = false );
40 declareProperty("LVL2ElectronCutOn" , m_localLVL2ElectronCutOn = false);
41 declareProperty("LVL1MuonCutPT" , m_localLVL1MuonCutPT = 0.0 );
42 declareProperty("LVL1MuonCutEta" , m_localLVL1MuonCutEta = 102.5 );
43 declareProperty("LVL2MuonCutPT" , m_localLVL2MuonCutPT = 0.0 );
44 declareProperty("LVL2MuonCutEta" , m_localLVL2MuonCutEta = 102.5 );
45 declareProperty("LVL2ElectronCutPT" , m_localLVL2ElectronCutPT = 0.0 );
46 declareProperty("LVL2ElectronCutEta" , m_localLVL2ElectronCutEta = 102.5);
47 declareProperty("Cuts_Final_e_switch" , m_cuts_f_e_on = false );
48 declareProperty("Cuts_Final_e_pT" , m_cuts_f_e_pT = 0. );
49 declareProperty("Cuts_Final_e_eta" , m_cuts_f_e_eta = 2.5 );
50 declareProperty("Cuts_Final_mu_switch" , m_cuts_f_mu_on = false );
51 declareProperty("Cuts_Final_mu_pT" , m_cuts_f_mu_pT = 0. );
52 declareProperty("Cuts_Final_mu_eta" , m_cuts_f_mu_eta = 102.5 );
53 declareProperty("Cuts_Final_hadrons_switch", m_cuts_f_had_on = false );
54 declareProperty("Cuts_Final_hadrons_pT" , m_cuts_f_had_pT = 0. );
55 declareProperty("Cuts_Final_hadrons_eta" , m_cuts_f_had_eta = 102.5 );
56 declareProperty("Cuts_Final_gamma_switch" , m_cuts_f_gam_on = false );
57 declareProperty("Cuts_Final_gamma_pT" , m_cuts_f_gam_pT = 0. );
58 declareProperty("Cuts_Final_gamma_eta" , m_cuts_f_gam_eta = 102.5 );
59 declareProperty("Cuts_Final_K0_switch" , m_cuts_f_K0_on = false );
60 declareProperty("Cuts_Final_K0_pT" , m_cuts_f_K0_pT = 0. );
61 declareProperty("Cuts_Final_K0_eta" , m_cuts_f_K0_eta = 102.5 );
62 //
63 // ** Declare the signal B-meson/hadron PDGid
64 declareProperty("B_PDGCode" ,m_B_pdgid = 0);
65 //
66 // ** Declare properties for mass filter **
67 declareProperty("InvMass_switch" , m_InvMass_switch = false );
68 declareProperty("InvMass_PartId1" , m_InvMass_PartId1 = 13 );
69 declareProperty("InvMass_PartId2" , m_InvMass_PartId2 = -m_InvMass_PartId1 );
70 declareProperty("InvMass_PartFakeMass1", m_InvMass_PartFakeMass1 = -1. );
71 declareProperty("InvMass_PartFakeMass2", m_InvMass_PartFakeMass2 = -1. );
72 declareProperty("InvMassMin" , m_InvMassMin = 0.0 );
73 declareProperty("InvMassMax" , m_InvMassMax = 14000000.0 );
74 declareProperty("TotalInvMass_switch" , m_TotalInvMass_switch = false );
75 declareProperty("TotalInvMassMin" , m_TotalInvMassMin = 0.0 );
76 declareProperty("TotalInvMassMax" , m_TotalInvMassMax = 14000000.0 );
77
78 // ** Initialise event counter **
79 m_EventCnt = 0;
80 m_LVL1Counter = 0;
81 m_LVL2Counter = 0;
82 m_rejectedTrigger = 0;
83 m_rejectedAll = 0;
84
85}
Base class for event generator filtering modules.
Definition GenFilter.h:30

Member Function Documentation

◆ ATLAS_NOT_CONST_THREAD_SAFE() [1/2]

McEventCollection *events GenBase::ATLAS_NOT_CONST_THREAD_SAFE ( )
inherited

Access the current event's McEventCollection.

Note
This function will make a new McEventCollection if there is not already a valid one and MakeMcEvent=True.

◆ ATLAS_NOT_CONST_THREAD_SAFE() [2/2]

HepMC::GenEvent *event GenBase::ATLAS_NOT_CONST_THREAD_SAFE ( )
inlineinherited

Access the current signal event (first in the McEventCollection).

Note
This function will make a new McEventCollection if there is not already a valid one and MakeMcEvent=True.

Definition at line 76 of file GenBase.h.

76 {
77 if (events()->empty())
78 ATH_MSG_ERROR("McEventCollection is empty during first event access");
79 return *(events()->begin());
80 }
#define ATH_MSG_ERROR(x)
static const Attributes_t empty

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ event_const()

const HepMC::GenEvent * GenBase::event_const ( const EventContext & ctx) const
inlineinherited

Access the current signal event (const).

Definition at line 83 of file GenBase.h.

83 {
84 const McEventCollection* coll = events_const(ctx);
85 if (coll->empty())
86 ATH_MSG_ERROR("Const McEventCollection is empty during first event access");
87 return *(coll->begin());
88 }
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
bool empty() const noexcept
Returns true if the collection is empty.
const McEventCollection * events_const(const EventContext &ctx) const
Access the current event's McEventCollection (const).
Definition GenBase.h:97

◆ events_const()

const McEventCollection * GenBase::events_const ( const EventContext & ctx) const
inlineinherited

Access the current event's McEventCollection (const).

Definition at line 97 of file GenBase.h.

97 {
98 SG::ReadHandle<McEventCollection> ret = SG::makeHandle(m_mcevents_const, ctx);
99 if (!ret.isValid())
100 ATH_MSG_ERROR("No McEventCollection found in StoreGate with key " << m_mcevents_const.key());
101 return ret.cptr();
102 }
SG::ReadHandleKey< McEventCollection > m_mcevents_const
Const handle to the MC event collection.
Definition GenBase.h:145
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode GenFilter::execute ( const EventContext & ctx)
virtualinherited

Execute method.

Provides access to the EventContext if needed but is non-const as opposed to AthReentrantAlgorithm.

Todo
Probably the filter should only look at the first event... right?

Reimplemented from GenBase.

Definition at line 27 of file GenFilter.cxx.

27 {
28 if (events_const(ctx)->empty()) {
29 ATH_MSG_ERROR("No events found in McEventCollection");
30 return StatusCode::FAILURE;
31 } else if (events_const(ctx)->size() > 1) {
33 ATH_MSG_WARNING("More than one event in current McEventCollection -- which is valid?");
34 }
36 if (filterPassed(ctx) || m_keepAll ) {
37 ATH_MSG_DEBUG("Event passed filter");
38 m_nPass += 1;
39 } else {
40 ATH_MSG_DEBUG("Event failed filter");
41 m_nFail += 1;
42 }
43 // Bail out once we have enough events
44 if (m_nPass >= m_nNeeded && m_nNeeded > 0)
45 sc = StatusCode::FAILURE;
46 return sc;
47}
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
size_t size() const
Number of registered mappings.
bool filterPassed() const
bool m_keepAll
Definition GenFilter.h:66
int m_nPass
Definition GenFilter.h:63
int m_nNeeded
Definition GenFilter.h:65
virtual StatusCode filterEvent(const EventContext &ctx)=0
int m_nFail
Definition GenFilter.h:64
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthAlgorithm::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 50 of file AthAlgorithm.cxx.

51{
52 // If we didn't find any symlinks to add, just return the collection
53 // from the base class. Otherwise, return the extended collection.
54 if (!m_extendedExtraObjects.empty()) {
56 }
57 return Algorithm::extraOutputDeps();
58}
DataObjIDColl m_extendedExtraObjects

◆ filterEvent()

StatusCode BSignalFilter::filterEvent ( const EventContext & ctx)
virtual

Implements GenFilter.

Definition at line 88 of file BSignalFilter.cxx.

89{
90 ATH_MSG_INFO("");
91 ATH_MSG_INFO(" ---------------------------------- ");
92 ATH_MSG_INFO(" >>> BSignalFilter::FilterEvent <<< ");
93 ATH_MSG_INFO(" ---------------------------------- ");
94 ATH_MSG_INFO("");
95
96 // ** Return ERROR and exit if the user has not selected the PDGid of the B-meson/hadron signal **
97 if ( m_cuts_f_e_on || m_cuts_f_mu_on || m_cuts_f_had_on || m_cuts_f_gam_on || m_cuts_f_K0_on )
98 if (m_B_pdgid==0)
99 {
100 ATH_MSG_ERROR("");
101 ATH_MSG_ERROR(" ==>> 'B_PDGCode = 0'! Please define the PDGid of the B-meson/hadron signal!");
102 ATH_MSG_ERROR("");
103 return StatusCode::FAILURE;
104 }
105
106 // ** Begin iterating over McEventCollection **
108 for( itr = events()->begin(); itr != events()->end(); ++itr )
109 {
110 m_EventCnt++;
111 bool acceptEvent = true;
112 const HepMC::GenEvent* genEvt = (*itr);
113
114 // ** Check HepMC for particles activating LVL1 trigger, if that is what user wishes **
115 //
116 bool LVL1Passed = false;
117 HepMC::ConstGenParticlePtr LVL1Muon = nullptr;
118 //
119 if ( m_localLVL1MuonCutOn ) {
120 for(const auto& part: *genEvt){
121 bool LVL1Result = LVL1_Mu_Trigger( part );
122 if ( LVL1Result )
123 {
124 LVL1Passed = true;
125 LVL1Muon = part; // Remember the muon for LVL2 testing
126 break;
127 }
128 }
129 }
130
131 // ** Check HepMC for particles activating LVL2 trigger, if that is what user wishes **
132 //
133 bool LVL2Passed = false;
134 //
135 if ( LVL1Passed && (m_localLVL2MuonCutOn || m_localLVL2ElectronCutOn) )
136 {
137 for(const auto& part: *genEvt)
138 {
139 bool LVL2Result = LVL2_eMu_Trigger( part );
140 if ( LVL2Result )
141 {
142 if ( part != LVL1Muon ) // Check the particle triggering LVL2 isn't
143 LVL2Passed = true; // the muon that triggered LVL1 --> Artificial,
144 // since, effectively, LVL2 trigger is not applied.
145 // This is needed to "trigger" the 2nd muon!
146 }
147 }
148 }
149
150 // ** Flag event as passing LVL1 if it has passed **
151 //cy of both versions of the filter and go
152 if ( m_localLVL1MuonCutOn && LVL1Passed )
153 {
154 ATH_MSG_DEBUG(" LVL1 Trigger activated for event " << m_EventCnt);
156 }
157 // ** Flag event as passing LVL2 if it has passed **
158 //
159 if ( (m_localLVL2MuonCutOn || m_localLVL2ElectronCutOn) && LVL2Passed )
160 {
161 ATH_MSG_DEBUG(" LVL2 Trigger activated for event " << m_EventCnt);
163 }
164
165 // ** If user hasn't requested triggers then set everything to true so nothing is thrown away **
166 //
167 if ( !m_localLVL1MuonCutOn )
168 {
169 LVL1Passed = true;
170 LVL2Passed = true;
171 }
172 if ( !m_localLVL2MuonCutOn && !m_localLVL2ElectronCutOn ) LVL2Passed = true;
173
174 // ** Reject event if an undecayed quark is found **
175 //
176 for(const auto& part: *genEvt)
177 {
178 if ( std::abs(part->pdg_id()) <= 6 && MC::isStable(part) )
179 {
180 acceptEvent = false;
181 ATH_MSG_WARNING(" Undecayed quark "<< part);
182 }
183 }
184
185 // ** Look for signal events **
186 //
187 bool SignalPassedCuts=false;
188 if ( LVL1Passed && LVL2Passed )
189 {
190 // ** Loop on all particles **
191 for(const auto& part: *genEvt)
192 {
193 const int particleID = part->pdg_id();
194 //
195 bool motherIsB = false;
196 bool newBChain = false;
197
198 if( ( MC::isBottomMeson(particleID) || MC::isBottomBaryon(particleID) ) && MC::isPhysical(part) ){
199 // ** Reject whole event if any of B-hadrons in the event is not decayed **
200 if( MC::isStable(part)) { acceptEvent = false; }
201
202 auto firstParent = part->production_vertex()->particles_in().begin();
203 auto lastParent = part->production_vertex()->particles_in().end();
204 for (auto thisParent = firstParent; thisParent != lastParent; ++thisParent ) {
205 if (MC::isBottomMeson(*thisParent) || MC::isBottomBaryon(*thisParent) ) motherIsB = true;
206 }
207 if( motherIsB ){
208 newBChain = false; // Since the chain is not new
209 }else{
210 newBChain = true;
211 }
212 }
213 else{ newBChain = false; } // Since particle is not b
214
215 // ** New B-signal found, output message and find whole decay tree **
216 if( newBChain )
217 {
218 const HepPDT::ParticleData* HadronData = particleData(particleID);
219 std::string HadronName = "unknown particle";
220 if (HadronData){
221 HadronName = HadronData->name();
222 if (particleID < 0) HadronName = "anti - " + HadronName;
223 }
224 ATH_MSG_DEBUG("");
225 ATH_MSG_DEBUG(" ------------------------------------------ ");
226 ATH_MSG_DEBUG(" *** BSignalFilter.cxx: B-signal found *** ");
227 ATH_MSG_DEBUG(" ------------------------------------------ ");
228 ATH_MSG_DEBUG("");
229 ATH_MSG_DEBUG(" Event " << m_EventCnt << " --> B-hadron/B-meson (" << HadronName << ") " << part);
230 ATH_MSG_DEBUG("");
231
232 // ** Looping on all children checking if they have passed the selection cuts defined by the user **
233 if ( m_cuts_f_e_on || m_cuts_f_mu_on || m_cuts_f_had_on || m_cuts_f_gam_on || m_cuts_f_K0_on
234 || m_InvMass_switch || m_TotalInvMass_switch )
235 {
236 ATH_MSG_DEBUG(" *** KINEMATIC CUTS ON PARTICLES ACTIVATED *** ");
237 ATH_MSG_DEBUG("");
238 ATH_MSG_DEBUG(" --------------------------------- ");
239 ATH_MSG_DEBUG(" Started looping on all children ");
240 ATH_MSG_DEBUG(" --------------------------------- ");
241 ATH_MSG_DEBUG("");
242 //
243 bool isSignal=false;
244 bool havePassedCuts=true;
245 TLorentzVector CandPart1, CandPart2, total_4mom;
246 //
247 FindAllChildren(part,"",false,isSignal,havePassedCuts,CandPart1,CandPart2,false,total_4mom);
248 //
249 ATH_MSG_DEBUG("");
250 ATH_MSG_DEBUG(" ------------------------------- ");
251 ATH_MSG_DEBUG(" Ended looping on all children ");
252 ATH_MSG_DEBUG(" ------------------------------- ");
253 ATH_MSG_DEBUG("");
254
255 SignalPassedCuts = ( isSignal && havePassedCuts );
256
257 // ** If signal event is found and InvMass_switch = true, check if the selected
258 // couple of particles has an invariant mass within the range set by the user **
259 if ( m_InvMass_switch )
260 {
261 if ( SignalPassedCuts )
262 {
263 bool accept_mass = false;
264 bool accept_total_mass = false;
265 ATH_MSG_DEBUG("");
266 ATH_MSG_DEBUG(" *** INVARIANT MASS CUTS ON PARTICLES ACTIVATED! *** ");
267 ATH_MSG_DEBUG("");
268 ATH_MSG_DEBUG(" -- Mass cuts -->> " << m_InvMassMin << " < mass < " << m_InvMassMax << " MeV");
269 //
270 double invMass = ( CandPart1 + CandPart2 ).M();
271 double invMass_total = total_4mom.M();
272 //
273
274 if ( m_InvMass_switch )
275 {
276 ATH_MSG_DEBUG(" -- Invariant mass of the couple of particles = " << invMass << " MeV");
277 if ( m_InvMassMin < invMass && invMass < m_InvMassMax )
278 {
279 ATH_MSG_DEBUG(" ==>> Event has passed the mass filter!");
280 ATH_MSG_DEBUG("");
281 accept_mass = true;
282 }else
283 {
284 ATH_MSG_DEBUG(" ==>> Event has NOT passed the mass filter!");
285 ATH_MSG_DEBUG("");
286 }
287 SignalPassedCuts = SignalPassedCuts && accept_mass;
288 }
289 if ( m_TotalInvMass_switch )
290 {
291 ATH_MSG_DEBUG(" -- Total invariant mass of the final-state particles = " << invMass_total << " MeV");
292 if ( m_TotalInvMassMin < invMass_total && invMass_total < m_TotalInvMassMax )
293 {
294 ATH_MSG_DEBUG(" ==>> Event has passed the total mass filter!");
295 ATH_MSG_DEBUG("");
296 accept_total_mass = true;
297 } else {
298 ATH_MSG_DEBUG(" ==>> Event has NOT passed the total mass filter!");
299 ATH_MSG_DEBUG("");
300 }
301 SignalPassedCuts = SignalPassedCuts && accept_total_mass;
302 }
303 }else{
304 ATH_MSG_DEBUG("");
305 ATH_MSG_DEBUG(" *** INVARIANT MASS CUTS ON PARTICLES NOT APPLIED (since the event is not a signal that passed cuts)! *** ");
306 ATH_MSG_DEBUG("");
307 }
308 }else{
309 ATH_MSG_DEBUG(" *** INVARIANT MASS CUTS ON PARTICLES NOT ACTIVATED *** ");
310 ATH_MSG_DEBUG("");
311 }
312 }else{
313 SignalPassedCuts = true;
314 //
315 ATH_MSG_DEBUG(" *** KINEMATIC CUTS ON PARTICLES NOT ACTIVATED ==>> ACCEPT ALL EVENTS! *** ");
316 ATH_MSG_DEBUG("");
317 }
318 } // End newBChain
319 if ( SignalPassedCuts ) break; // We have found the signal, we do not need to look for other particles
320 } // End particle iteration
321
322 if ( SignalPassedCuts )
323 {
324 ATH_MSG_DEBUG(" -->> All signal children have passed cuts on particles!");
325 }else{
326 ATH_MSG_DEBUG(" -->> Signal children have NOT passed cuts on particles!");
327 }
328 } // end of LVL1/LVL2 selection
329 else{
330 ATH_MSG_DEBUG("");
331 ATH_MSG_DEBUG(" -->> Event has NOT passed the trigger!");
332 }
333 // ** Reject event if it has not passed triggers **
334 // --> If not requested by user these flags will be set
335 // to true so there will be no erroneous rejection
336 if ( (!LVL1Passed) || (!LVL2Passed) ){
338 acceptEvent = false;
339 }
340
341 // ** Check if all conditions are true **
342 // --> Accept the event if acceptEvent is true and the event is a signal event
343 acceptEvent = acceptEvent && SignalPassedCuts;
344
345 // ** Print whether the event has passed or not **
346 //
347 ATH_MSG_DEBUG("");
348 if( !acceptEvent )
349 {
350 setFilterPassed(false, ctx);
352 ATH_MSG_DEBUG(" ==========================");
353 ATH_MSG_DEBUG(" Event REJECTED by Filter ");
354 ATH_MSG_DEBUG(" ==========================");
355 }else
356 {
357 setFilterPassed(true, ctx);
358 ATH_MSG_DEBUG(" ==========================");
359 ATH_MSG_DEBUG(" Event ACCEPTED by Filter ");
360 ATH_MSG_DEBUG(" ==========================");
361 }
362 ATH_MSG_DEBUG("");
363
364 } // End event iteration
365 // End of execution for each event
366 return StatusCode::SUCCESS;
367}
#define ATH_MSG_INFO(x)
void setFilterPassed(bool state) const
double m_LVL1Counter
double m_rejectedAll
double m_rejectedTrigger
void FindAllChildren(const HepMC::ConstGenParticlePtr &mother, std::string treeIDStr, bool fromFinalB, bool &foundSignal, bool &passedAllCuts, TLorentzVector &p1, TLorentzVector &p2, bool fromSelectedB, TLorentzVector &total_4mom) const
bool LVL2_eMu_Trigger(const HepMC::ConstGenParticlePtr &child) const
double m_LVL2Counter
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const HepPDT::ParticleData * particleData(int pid) const
Access an element in the particle data table.
Definition GenBase.h:124
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
Definition GenParticle.h:20
HepMC3::GenEvent GenEvent
Definition GenEvent.h:39
bool isBottomMeson(const T &p)
bool isBottomBaryon(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
double invMass(const I4Momentum &pA, const I4Momentum &pB)
invariant mass from two I4momentum references
Definition P4Helpers.h:252

◆ filterFinalize()

StatusCode BSignalFilter::filterFinalize ( )
virtual

Reimplemented from GenFilter.

Definition at line 640 of file BSignalFilter.cxx.

641{
642 double total = m_EventCnt;
643 ATH_MSG_ALWAYS(" I===============================================================================================");
644 ATH_MSG_ALWAYS(" I BSignalFilter Summary Report ");
645 ATH_MSG_ALWAYS(" I===============================================================================================");
646 if (m_localLVL1MuonCutOn)
647 {
648 ATH_MSG_ALWAYS(" I LVL1 muon trigger report:");
649 ATH_MSG_ALWAYS(" I Muon pT cut " << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << "I" << '\t'
650 << m_localLVL1MuonCutPT << " MeV ");
651 ATH_MSG_ALWAYS(" I Muon pseudo-rapidity cut" << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << "I" << '\t'
652 << m_localLVL1MuonCutEta);
653 ATH_MSG_ALWAYS(" I No of events containing at least " << '\t' << '\t' << '\t' << '\t' << '\t' << "I");
654 ATH_MSG_ALWAYS(" I one particle satisfying these cuts " << '\t' << '\t' << '\t' << '\t' << '\t' << "I" << '\t'
655 << m_LVL1Counter);
656 if (m_localLVL2MuonCutOn)
657 {
658 ATH_MSG_ALWAYS(" I LVL2 muon trigger report:");
659 ATH_MSG_ALWAYS(" I Muon pT cut " << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << "I" << '\t'
660 << m_localLVL2MuonCutPT << " MeV ");
661 ATH_MSG_ALWAYS(" I Muon pseudo-rapidity cut " << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << "I" << '\t'
662 << m_localLVL2MuonCutEta);
663 }
664 if (m_localLVL2ElectronCutOn)
665 {
666 ATH_MSG_ALWAYS(" I LVL2 electron trigger report:");
667 ATH_MSG_ALWAYS(" I Electron pT cut " << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' << '\t' <<
668 " I" << '\t' << m_localLVL2ElectronCutPT << " MeV ");
669 ATH_MSG_ALWAYS(" I Electron pseudo-rapidity cut " << '\t' << '\t' << '\t' << '\t' << '\t' << "I"
670 << '\t' << m_localLVL2ElectronCutEta);
671 }
672 if (m_localLVL2MuonCutOn || m_localLVL2ElectronCutOn)
673 {
674 ATH_MSG_ALWAYS(" I No of events containing at least one muon satisfying LVL1 cut" << '\t' << "I");
675 ATH_MSG_ALWAYS(" I and at least one separate particle passing these LVL2 cuts " << '\t' << '\t' << "I" << '\t'
676 << m_LVL2Counter);
677 }
678 }
679 ATH_MSG_ALWAYS(" I Total no of input events " << '\t'<< '\t'<< '\t'<< '\t'<< '\t'<< '\t'<< '\t' << "I" << '\t'
680 << total);
681 ATH_MSG_ALWAYS(" I No of events rejected by trigger " << '\t' << '\t'<< '\t'<< '\t'<< '\t'<< '\t'<< '\t' << "I" << '\t'
682 << m_rejectedTrigger);
683 ATH_MSG_ALWAYS(" I No of events rejected in total " << '\t' << '\t'<< '\t'<< '\t'<< '\t'<< '\t'<< '\t' << "I" << '\t'
684 << m_rejectedAll);
685 if (m_localLVL1MuonCutOn && (!m_localLVL2MuonCutOn && !m_localLVL2ElectronCutOn))
686 ATH_MSG_ALWAYS(" I To obtain correct cross section, multiply BX in PythiaB report by " << '\t' << '\t' << "I" << '\t'
687 << m_LVL1Counter / total);
688 if (m_localLVL1MuonCutOn && (m_localLVL2MuonCutOn || m_localLVL2ElectronCutOn))
689 ATH_MSG_ALWAYS(" I To obtain correct cross section, multiply BX in PythiaB report by " << '\t' << '\t' << "I" << '\t'
690 << m_LVL2Counter / total);
691 if (!m_localLVL1MuonCutOn)
692 ATH_MSG_ALWAYS(" I No trigger requests made");
693 //
694 ATH_MSG_ALWAYS(" I=========================================== End of report =====================================");
695
696 return StatusCode::SUCCESS;
697}
#define ATH_MSG_ALWAYS(x)

◆ filterInitialize()

virtual StatusCode GenFilter::filterInitialize ( )
inlinevirtualinherited

Reimplemented in BoostedHadTopAndTopPair, ChargedTracksWeightFilter, DecaysFinalStateFilter, DecayTimeFilter, DiBjetFilter, DiLeptonMassFilter, DiPhotonFilter, DirectPhotonFilter, FourLeptonInvMassFilter, FourLeptonMassFilter, HeavyFlavorHadronFilter, HTFilter, JetFilter, LeptonFilter, LeptonPairFilter, M4MuIntervalFilter, MassRangeFilter, MuDstarFilter, MultiBjetFilter, MultiCjetFilter, MultiParticleFilter, ParentChildFilter, ParentChildwStatusFilter, ParentTwoChildrenFilter, ParticleDecayFilter, ParticleFilter, QCDTruthJetFilter, QCDTruthMultiJetFilter, SameParticleHardScatteringFilter, TauFilter, TrimuMassRangeFilter, TruthJetFilter, TTbarPlusHeavyFlavorFilter, TTbarWithJpsimumuFilter, VBFForwardJetsFilter, VBFHbbEtaSortingFilter, VBFMjjIntervalFilter, xAODBSignalFilter, xAODChargedTracksFilter, xAODChargedTracksWeightFilter, xAODDecaysFinalStateFilter, xAODDecayTimeFilter, xAODDiLeptonMassFilter, xAODDiPhotonFilter, xAODDirectPhotonFilter, xAODElectronFilter, xAODForwardProtonFilter, xAODFourLeptonInvMassFilter, xAODFourLeptonMassFilter, xAODHeavyFlavorHadronFilter, xAODHTFilter, xAODJetFilter, xAODLeptonFilter, xAODLeptonPairFilter, xAODM4MuIntervalFilter, xAODMETFilter, xAODMuDstarFilter, xAODMultiBjetFilter, xAODMultiCjetFilter, xAODMultiElecMuTauFilter, xAODMultiElectronFilter, xAODMultiLeptonFilter, xAODMultiMuonFilter, xAODMuonFilter, xAODParentChildFilter, xAODParentTwoChildrenFilter, xAODParticleDecayFilter, xAODParticleFilter, xAODPhotonFilter, xAODSameParticleHardScatteringFilter, xAODSplitPhotonFilter, xAODTauFilter, xAODTTbarWithJpsimumuFilter, xAODTTbarWToLeptonFilter, xAODVBFForwardJetsFilter, xAODVBFMjjIntervalFilter, xAODXtoVVDecayFilterExtended, and XtoVVDecayFilterExtended.

Definition at line 45 of file GenFilter.h.

45{ return StatusCode::SUCCESS; }

◆ filterPassed() [1/2]

bool AthAlgorithm::filterPassed ( ) const
inherited

Definition at line 94 of file AthAlgorithm.cxx.

94 {
95 return filterPassed( Gaudi::Hive::currentContext() );
96}

◆ filterPassed() [2/2]

bool AthAlgorithm::filterPassed ( const EventContext & ctx) const
inherited

Definition at line 98 of file AthAlgorithm.cxx.

98 {
99 return execState( ctx ).filterPassed();
100}

◆ finalize()

StatusCode GenFilter::finalize ( )
inherited

Definition at line 50 of file GenFilter.cxx.

50 {
51 ATH_MSG_INFO("Events passed = " << m_nPass << " Events failed = " << m_nFail);
53 return StatusCode::SUCCESS;
54}
#define CHECK(...)
Evaluate an expression and check for errors.
virtual StatusCode filterFinalize()
Definition GenFilter.h:47

◆ FinalStatePassedCuts()

bool BSignalFilter::FinalStatePassedCuts ( const HepMC::ConstGenParticlePtr & child) const
private

Definition at line 489 of file BSignalFilter.cxx.

490{
491 bool accept = true;
492
493 // ** Look if children has passed the cuts **
494 //
495 int pID = child->pdg_id();
496 double myPT = child->momentum().perp();
497 double myEta = child->momentum().pseudoRapidity();
498
499 ATH_MSG_DEBUG("");
500 ATH_MSG_DEBUG(" ** Found a child with: ");
501 ATH_MSG_DEBUG(" - id = " << pID );
502 ATH_MSG_DEBUG(" - pT = " << myPT << " MeV");
503 ATH_MSG_DEBUG(" - eta = " << myEta );
504 ATH_MSG_DEBUG("");
505
506 if ( m_cuts_f_e_on )
507 {
508 if ( std::abs(pID) == 11 )
509 {
510 ATH_MSG_DEBUG(" ** ( pT , eta ) cuts applied on the electron --> ( " << m_cuts_f_e_pT
511 << " , " << m_cuts_f_e_eta << " )");
512 if ( test_cuts( myPT, m_cuts_f_e_pT, myEta, m_cuts_f_e_eta) )
513 {
514 ATH_MSG_DEBUG(" ==>> Found an electron which passed the pT and eta cuts!");
515 ATH_MSG_DEBUG(" - Electron: pT = " << myPT << " MeV");
516 ATH_MSG_DEBUG(" - Electron: eta = " << myEta);
517 ATH_MSG_DEBUG("");
518 ATH_MSG_DEBUG(" ==>> Accepted the electron!");
519 ATH_MSG_DEBUG("");
520 }else
521 {
522 accept = false;
523 ATH_MSG_DEBUG(" ==>> The electron has NOT passed the pT and eta cuts!");
524 ATH_MSG_DEBUG("");
525 }
526 }
527 }
528 if ( m_cuts_f_mu_on )
529 {
530 if ( std::abs(pID) == 13 )
531 {
532 ATH_MSG_DEBUG(" ** ( pT , eta ) cuts applied on the muon --> ( " << m_cuts_f_mu_pT
533 << " , " << m_cuts_f_mu_eta << " )");
534 if ( test_cuts( myPT, m_cuts_f_mu_pT, myEta, m_cuts_f_mu_eta) )
535 {
536 ATH_MSG_DEBUG(" ==>> Found a muon which passed the pT and eta cuts!");
537 ATH_MSG_DEBUG(" - Muon: pT = " << myPT << " MeV");
538 ATH_MSG_DEBUG(" - Muon: eta = " << myEta);
539 ATH_MSG_DEBUG("");
540 ATH_MSG_DEBUG(" ==>> Accepted the muon!");
541 ATH_MSG_DEBUG("");
542 }else
543 {
544 accept = false;
545 ATH_MSG_DEBUG(" ==>> The muon has NOT passed the pT and eta cuts!");
546 ATH_MSG_DEBUG("");
547 }
548 }
549 }
550 if ( m_cuts_f_had_on )
551 {
552 if ( MC::isHadron(pID) && MC::isCharged(pID))
553 {
554 ATH_MSG_DEBUG(" ** ( pT , eta ) cuts applied on the charged hadron --> ( " << m_cuts_f_had_pT
555 << " , " << m_cuts_f_had_eta << " )");
556 if ( test_cuts( myPT, m_cuts_f_had_pT, myEta, m_cuts_f_had_eta) )
557 {
558 ATH_MSG_DEBUG(" ==>> Found a charged hadron which passed the pT and eta cuts!");
559 ATH_MSG_DEBUG(" - Charged hadron: pT = " << myPT << " MeV");
560 ATH_MSG_DEBUG(" - Charged hadron: eta = " << myEta);
561 ATH_MSG_DEBUG("");
562 ATH_MSG_DEBUG(" ==>> Accepted the charged hadron!");
563 ATH_MSG_DEBUG("");
564 }else
565 {
566 accept = false;
567 ATH_MSG_DEBUG(" ==>> The charged hadron has NOT passed the pT and eta cuts!");
568 ATH_MSG_DEBUG("");
569 }
570 }
571 }
572 if ( m_cuts_f_gam_on )
573 {
574 if ( std::abs(pID) == 22 )
575 {
576 ATH_MSG_DEBUG(" ** ( pT , eta ) cuts applied on the gamma --> ( " << m_cuts_f_gam_pT
577 << " , " << m_cuts_f_gam_eta << " )");
578 if ( test_cuts( myPT, m_cuts_f_gam_pT, myEta, m_cuts_f_gam_eta) )
579 {
580 ATH_MSG_DEBUG(" ==>> Found a gamma which passed the pT and eta cuts!");
581 ATH_MSG_DEBUG(" - Gamma: pT = " << myPT << " MeV");
582 ATH_MSG_DEBUG(" - Gamma: eta = " << myEta);
583 ATH_MSG_DEBUG("");
584 ATH_MSG_DEBUG(" ==>> Accepted the gamma!");
585 ATH_MSG_DEBUG("");
586 }else
587 {
588 accept = false;
589 ATH_MSG_DEBUG(" ==>> The gamma has NOT passed the pT and eta cuts!");
590 ATH_MSG_DEBUG("");
591 }
592 }
593 }
594 if ( m_cuts_f_K0_on )
595 {
596 if ( std::abs(pID) == 311 )
597 {
598 ATH_MSG_DEBUG(" ** ( pT , eta ) cuts applied on the K0 --> ( " << m_cuts_f_K0_pT
599 << " , " << m_cuts_f_K0_eta << " )");
600 if ( test_cuts( myPT, m_cuts_f_K0_pT, myEta, m_cuts_f_K0_eta) )
601 {
602 ATH_MSG_DEBUG(" ==>> Found a K0 which passed the pT and eta cuts!");
603 ATH_MSG_DEBUG(" - K0: pT = " << myPT << " MeV");
604 ATH_MSG_DEBUG(" - K0: eta = " << myEta);
605 ATH_MSG_DEBUG("");
606 ATH_MSG_DEBUG(" ==>> Accepted the K0!");
607 ATH_MSG_DEBUG("");
608 }else
609 {
610 accept = false;
611 ATH_MSG_DEBUG(" ==>> The K0 has NOT passed the pT and eta cuts!");
612 ATH_MSG_DEBUG("");
613 }
614 }
615 }
616
617 return accept;
618
619}
bool test_cuts(const double myPT, const double testPT, const double myEta, const double testEta) const
StatusCode accept(const xAOD::Muon *mu)
bool isCharged(const T &p)
bool isHadron(const T &p)

◆ FindAllChildren()

void BSignalFilter::FindAllChildren ( const HepMC::ConstGenParticlePtr & mother,
std::string treeIDStr,
bool fromFinalB,
bool & foundSignal,
bool & passedAllCuts,
TLorentzVector & p1,
TLorentzVector & p2,
bool fromSelectedB,
TLorentzVector & total_4mom ) const
private

Definition at line 407 of file BSignalFilter.cxx.

410{
411 int pID = mother->pdg_id();
412 //
413 if ( !(mother->end_vertex()) && MC::isStable(mother) ) // i.e. this is a final state
414 {
415 bool hasChildGoodParent = fromFinalB && (fromSelectedB || m_B_pdgid==0);
416 //
417 if( fromFinalB && hasChildGoodParent )
418 {
419 foundSignal=true;
420 bool passedCut = FinalStatePassedCuts(mother); // X = X && ... in case of multiple particles (e.g. KK)
421 if ( m_cuts_f_e_on && std::abs(pID)==11 ) passedAllCuts = passedAllCuts && passedCut;
422 if ( m_cuts_f_mu_on && std::abs(pID)==13 ) passedAllCuts = passedAllCuts && passedCut;
423 if ( m_cuts_f_had_on && MC::isHadron(pID) && MC::isCharged(pID) ) passedAllCuts = passedAllCuts && passedCut;
424 if ( m_cuts_f_gam_on && std::abs(pID)==22 ) passedAllCuts = passedAllCuts && passedCut;
425 if ( m_cuts_f_K0_on && std::abs(pID)==311 ) passedAllCuts = passedAllCuts && passedCut;
426 //
427 if ( (m_InvMass_switch || m_TotalInvMass_switch) && m_InvMass_PartId1==pID )
428 {
429 if (m_InvMass_PartFakeMass1 < 0.) p1.SetPxPyPzE(mother->momentum().x(),mother->momentum().y(),mother->momentum().z(),mother->momentum().e() );
430 else p1.SetXYZM(mother->momentum().x(),mother->momentum().y(),mother->momentum().z(),m_InvMass_PartFakeMass1);
431 total_4mom = total_4mom + p1;
432 } else if ( (m_InvMass_switch || m_TotalInvMass_switch) && m_InvMass_PartId2==pID ) {
433 if (m_InvMass_PartFakeMass2 < 0.) p2.SetPxPyPzE(mother->momentum().x(),mother->momentum().y(),mother->momentum().z(),mother->momentum().e() );
434 else p2.SetXYZM(mother->momentum().x(),mother->momentum().y(),mother->momentum().z(),m_InvMass_PartFakeMass2);
435 total_4mom = total_4mom + p2;
436 } else if (m_TotalInvMass_switch) {
437 TLorentzVector current_4p;
438 current_4p.SetPxPyPzE(mother->momentum().x(),mother->momentum().y(),mother->momentum().z(),mother->momentum().e());
439 total_4mom = total_4mom + current_4p;
440 }
441 }
442 return;
443 }
444 else{
445 if ( !(mother->end_vertex()) ) // i.e. something is wrong in HepMC
446 {
447 if (MC::isDecayed(mother))
448 ATH_MSG_DEBUG(" Inconsistent entry in HepMC (status 2 particle not decayed), chain rejected!");
449 return;
450 }
451 }
452 auto firstChild = mother->end_vertex()->particles_out().begin();
453 auto lastChild = mother->end_vertex()->particles_out().end();
454
455 int childCnt = 0;
456 std::string childIDStr;
457 if( !( treeIDStr=="" ) ) treeIDStr = treeIDStr + ".";
458
459 // ** Find out whether particle is child of final (non-excited) B, used for cuts **
460 if( (!fromFinalB) && (MC::isBottomMeson(pID) || MC::isBottomBaryon(pID)) )
461 {
462 fromFinalB = true;
463 int pID{};
464 for (auto thisChild = firstChild; thisChild != lastChild; ++thisChild)
465 {
466 pID = (*thisChild)->pdg_id();
467 if( MC::isBottomMeson(pID) || MC::isBottomBaryon(pID) ) fromFinalB = false;
468 }
469 }
470
471 // ** Main loop: iterate over all children, call method recursively.
472 //Note: Iterators changed between HEPMC2 and HEPMC3; the previous version
473 //was a custom iterator which could be incremented indefinitely, always returning
474 //'end' when necessary. In HEPMC3, these are standard library iterators
475 for (auto thisChild = firstChild; thisChild != lastChild; ++thisChild)
476 {
477 childCnt++;
478 std::stringstream childCntSS; childCntSS << childCnt;
479 childIDStr = treeIDStr + childCntSS.str();
480 PrintChild( (*thisChild), childIDStr, fromFinalB );
481 FindAllChildren( (*thisChild),childIDStr,fromFinalB,foundSignal,passedAllCuts,p1,p2,(pID==m_B_pdgid) || fromSelectedB,total_4mom);
482 }
483
484 return;
485
486}
void PrintChild(const HepMC::ConstGenParticlePtr &child, const std::string &treeIDStr, const bool fromFinalB) const
bool isDecayed(const T &p)
Identify if the particle decayed.

◆ getContext()

const EventContext & AthAlgorithm::getContext ( ) const
inherited

Deprecated methods (use the ones with EventContext).

Definition at line 90 of file AthAlgorithm.cxx.

90 {
91 return Gaudi::Hive::currentContext();
92}

◆ initialize()

StatusCode GenFilter::initialize ( )
virtualinherited

Reimplemented from GenBase.

Definition at line 18 of file GenFilter.cxx.

18 {
20 m_nPass = 0;
21 m_nFail = 0;
23 return StatusCode::SUCCESS;
24}
virtual StatusCode initialize() override
Definition GenBase.cxx:17
virtual StatusCode filterInitialize()
Definition GenFilter.h:45

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isReEntrant()

virtual bool AthAlgorithm::isReEntrant ( ) const
inlinefinaloverrideprotectedvirtualinherited

Legacy algorithms are not thread-safe.

Definition at line 111 of file AthAlgorithm.h.

111{ return false; }

◆ keepAll()

bool GenFilter::keepAll ( ) const
inlineinherited

Definition at line 55 of file GenFilter.h.

55{return m_keepAll; }

◆ LVL1_Mu_Trigger()

bool BSignalFilter::LVL1_Mu_Trigger ( const HepMC::ConstGenParticlePtr & child) const
private

Definition at line 376 of file BSignalFilter.cxx.

377{
378 bool accept = false;
379 int pID = child->pdg_id();
380 double myPT = child->momentum().perp();
381 double myEta = child->momentum().pseudoRapidity();
382
383 if ( (std::abs(pID) == 13) && m_localLVL1MuonCutOn )
384 accept = test_cuts( myPT, m_localLVL1MuonCutPT, myEta, m_localLVL1MuonCutEta );
385
386 return accept;
387
388}

◆ LVL2_eMu_Trigger()

bool BSignalFilter::LVL2_eMu_Trigger ( const HepMC::ConstGenParticlePtr & child) const
private

Definition at line 391 of file BSignalFilter.cxx.

392{
393 bool accept = false;
394 int pID = child->pdg_id();
395 double myPT = child->momentum().perp();
396 double myEta = child->momentum().pseudoRapidity();
397
398 if ( (std::abs(pID) == 11) && m_localLVL2ElectronCutOn )
399 accept = test_cuts( myPT, m_localLVL2ElectronCutPT, myEta, m_localLVL2ElectronCutEta );
400 if ( (std::abs(pID) == 13) && m_localLVL2MuonCutOn )
401 accept = test_cuts( myPT, m_localLVL2MuonCutPT, myEta, m_localLVL2MuonCutEta );
402
403 return accept;
404}

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ nFailed()

int GenFilter::nFailed ( ) const
inlineinherited

Definition at line 53 of file GenFilter.h.

53{ return m_nFail; }

◆ nNeeded()

int GenFilter::nNeeded ( ) const
inlineinherited

Definition at line 54 of file GenFilter.h.

54{ return m_nNeeded; }

◆ nPassed()

int GenFilter::nPassed ( ) const
inlineinherited

Definition at line 52 of file GenFilter.h.

52{ return m_nPass; }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ particleData()

const HepPDT::ParticleData * GenBase::particleData ( int pid) const
inlineinherited

Access an element in the particle data table.

Definition at line 124 of file GenBase.h.

124 {
125 return pdt().particle(HepPDT::ParticleID(std::abs(pid)));
126 }
const HepPDT::ParticleDataTable & pdt() const
Shorter alias to get a particle data table.
Definition GenBase.h:121

◆ particleTable()

const HepPDT::ParticleDataTable & GenBase::particleTable ( ) const
inlineinherited

Get a particle data table.

Definition at line 116 of file GenBase.h.

116 {
117 return *(m_ppSvc->PDT());
118 }
ServiceHandle< IPartPropSvc > m_ppSvc
Handle on the particle property service.
Definition GenBase.h:142

◆ partPropSvc()

const ServiceHandle< IPartPropSvc > GenBase::partPropSvc ( ) const
inlineinherited

Access the particle property service.

Definition at line 111 of file GenBase.h.

111 {
112 return m_ppSvc;
113 }

◆ pdt()

const HepPDT::ParticleDataTable & GenBase::pdt ( ) const
inlineinherited

Shorter alias to get a particle data table.

Definition at line 121 of file GenBase.h.

121{ return particleTable(); }
const HepPDT::ParticleDataTable & particleTable() const
Get a particle data table.
Definition GenBase.h:116

◆ PrintChild()

void BSignalFilter::PrintChild ( const HepMC::ConstGenParticlePtr & child,
const std::string & treeIDStr,
const bool fromFinalB ) const
private

Definition at line 622 of file BSignalFilter.cxx.

624{
625 int pID = child->pdg_id();
626 // ** Find name **
627 const HepPDT::ParticleData* pData = particleData(std::abs(pID));
628 std::string pName = "unknown particle";
629 if (pData){
630 pName = pData->name();
631 if (pID < 0) pName = "anti - " + pName;
632 }
633 ATH_MSG_DEBUG(" " << treeIDStr << " " << "Child (" << pName
634 << ") " << child<<" , from final B = " << fromFinalB);
635
636 return;
637}

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed() [1/2]

void AthAlgorithm::setFilterPassed ( bool state) const
inherited

Definition at line 102 of file AthAlgorithm.cxx.

102 {
103 setFilterPassed( state, Gaudi::Hive::currentContext() );
104}

◆ setFilterPassed() [2/2]

void AthAlgorithm::setFilterPassed ( bool state,
const EventContext & ctx ) const
inherited

Definition at line 106 of file AthAlgorithm.cxx.

106 {
107 execState( ctx ).setFilterPassed(state);
108}

◆ sysInitialize()

StatusCode AthAlgorithm::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc.

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, and PyAthena::Alg.

Definition at line 66 of file AthAlgorithm.cxx.

66 {
68
69 if (sc.isFailure()) {
70 return sc;
71 }
72 ServiceHandle<ICondSvc> cs("CondSvc",name());
73 for (auto h : outputHandles()) {
74 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
75 // do this inside the loop so we don't create the CondSvc until needed
76 if ( cs.retrieve().isFailure() ) {
77 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
78 return StatusCode::SUCCESS;
79 }
80 if (cs->regHandle(this,*h).isFailure()) {
81 sc = StatusCode::FAILURE;
82 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
83 << " with CondSvc");
84 }
85 }
86 }
87 return sc;
88}
virtual StatusCode sysInitialize() override
Override sysInitialize.
AthCommonDataStore(const std::string &name, T... args)
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ test_cuts()

bool BSignalFilter::test_cuts ( const double myPT,
const double testPT,
const double myEta,
const double testEta ) const
private

Definition at line 370 of file BSignalFilter.cxx.

371{
372 return ( (myPT >= testPT) && (std::abs(myEta) <= testEta) );
373}

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_B_pdgid

int BSignalFilter::m_B_pdgid
private

Definition at line 54 of file BSignalFilter.h.

◆ m_cuts_f_e_eta

double BSignalFilter::m_cuts_f_e_eta
private

Definition at line 45 of file BSignalFilter.h.

◆ m_cuts_f_e_on

bool BSignalFilter::m_cuts_f_e_on
private

Definition at line 38 of file BSignalFilter.h.

◆ m_cuts_f_e_pT

double BSignalFilter::m_cuts_f_e_pT
private

Definition at line 43 of file BSignalFilter.h.

◆ m_cuts_f_gam_eta

double BSignalFilter::m_cuts_f_gam_eta
private

Definition at line 46 of file BSignalFilter.h.

◆ m_cuts_f_gam_on

bool BSignalFilter::m_cuts_f_gam_on
private

Definition at line 39 of file BSignalFilter.h.

◆ m_cuts_f_gam_pT

double BSignalFilter::m_cuts_f_gam_pT
private

Definition at line 44 of file BSignalFilter.h.

◆ m_cuts_f_had_eta

double BSignalFilter::m_cuts_f_had_eta
private

Definition at line 45 of file BSignalFilter.h.

◆ m_cuts_f_had_on

bool BSignalFilter::m_cuts_f_had_on
private

Definition at line 38 of file BSignalFilter.h.

◆ m_cuts_f_had_pT

double BSignalFilter::m_cuts_f_had_pT
private

Definition at line 43 of file BSignalFilter.h.

◆ m_cuts_f_K0_eta

double BSignalFilter::m_cuts_f_K0_eta
private

Definition at line 46 of file BSignalFilter.h.

◆ m_cuts_f_K0_on

bool BSignalFilter::m_cuts_f_K0_on
private

Definition at line 39 of file BSignalFilter.h.

◆ m_cuts_f_K0_pT

double BSignalFilter::m_cuts_f_K0_pT
private

Definition at line 44 of file BSignalFilter.h.

◆ m_cuts_f_mu_eta

double BSignalFilter::m_cuts_f_mu_eta
private

Definition at line 45 of file BSignalFilter.h.

◆ m_cuts_f_mu_on

bool BSignalFilter::m_cuts_f_mu_on
private

Definition at line 38 of file BSignalFilter.h.

◆ m_cuts_f_mu_pT

double BSignalFilter::m_cuts_f_mu_pT
private

Definition at line 43 of file BSignalFilter.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_EventCnt

int BSignalFilter::m_EventCnt
private

Definition at line 60 of file BSignalFilter.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthAlgorithm::m_extendedExtraObjects
privateinherited

Definition at line 114 of file AthAlgorithm.h.

◆ m_InvMass_PartFakeMass1

double BSignalFilter::m_InvMass_PartFakeMass1
private

Definition at line 56 of file BSignalFilter.h.

◆ m_InvMass_PartFakeMass2

double BSignalFilter::m_InvMass_PartFakeMass2
private

Definition at line 56 of file BSignalFilter.h.

◆ m_InvMass_PartId1

int BSignalFilter::m_InvMass_PartId1
private

Definition at line 55 of file BSignalFilter.h.

◆ m_InvMass_PartId2

int BSignalFilter::m_InvMass_PartId2
private

Definition at line 55 of file BSignalFilter.h.

◆ m_InvMass_switch

bool BSignalFilter::m_InvMass_switch
private

Definition at line 42 of file BSignalFilter.h.

◆ m_InvMassMax

double BSignalFilter::m_InvMassMax
private

Definition at line 57 of file BSignalFilter.h.

◆ m_InvMassMin

double BSignalFilter::m_InvMassMin
private

Definition at line 57 of file BSignalFilter.h.

◆ m_keepAll

bool GenFilter::m_keepAll
protectedinherited

Definition at line 66 of file GenFilter.h.

◆ m_localLVL1MuonCutEta

double BSignalFilter::m_localLVL1MuonCutEta
private

Definition at line 47 of file BSignalFilter.h.

◆ m_localLVL1MuonCutOn

bool BSignalFilter::m_localLVL1MuonCutOn
private

Definition at line 40 of file BSignalFilter.h.

◆ m_localLVL1MuonCutPT

double BSignalFilter::m_localLVL1MuonCutPT
private

Definition at line 47 of file BSignalFilter.h.

◆ m_localLVL2ElectronCutEta

double BSignalFilter::m_localLVL2ElectronCutEta
private

Definition at line 49 of file BSignalFilter.h.

◆ m_localLVL2ElectronCutOn

bool BSignalFilter::m_localLVL2ElectronCutOn
private

Definition at line 41 of file BSignalFilter.h.

◆ m_localLVL2ElectronCutPT

double BSignalFilter::m_localLVL2ElectronCutPT
private

Definition at line 48 of file BSignalFilter.h.

◆ m_localLVL2MuonCutEta

double BSignalFilter::m_localLVL2MuonCutEta
private

Definition at line 48 of file BSignalFilter.h.

◆ m_localLVL2MuonCutOn

bool BSignalFilter::m_localLVL2MuonCutOn
private

Definition at line 40 of file BSignalFilter.h.

◆ m_localLVL2MuonCutPT

double BSignalFilter::m_localLVL2MuonCutPT
private

Definition at line 47 of file BSignalFilter.h.

◆ m_LVL1Counter

double BSignalFilter::m_LVL1Counter
private

Definition at line 50 of file BSignalFilter.h.

◆ m_LVL2Counter

double BSignalFilter::m_LVL2Counter
private

Definition at line 51 of file BSignalFilter.h.

◆ m_mcEventKey

std::string GenBase::m_mcEventKey {}
protectedinherited

StoreGate key for the MC event collection (defaults to GEN_EVENT).

Definition at line 134 of file GenBase.h.

134{};

◆ m_mcevents_const

SG::ReadHandleKey<McEventCollection> GenBase::m_mcevents_const { this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" }
privateinherited

Const handle to the MC event collection.

Definition at line 145 of file GenBase.h.

145{ this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" };

◆ m_mkMcEvent

BooleanProperty GenBase::m_mkMcEvent {this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"}
protectedinherited

Flag to determine if a new MC event collection should be made if it doesn't exist.

Definition at line 136 of file GenBase.h.

136{this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"};

◆ m_nFail

int GenFilter::m_nFail
protectedinherited

Definition at line 64 of file GenFilter.h.

◆ m_nNeeded

int GenFilter::m_nNeeded
protectedinherited

Definition at line 65 of file GenFilter.h.

◆ m_nPass

int GenFilter::m_nPass
protectedinherited

Definition at line 63 of file GenFilter.h.

◆ m_ppSvc

ServiceHandle<IPartPropSvc> GenBase::m_ppSvc {this, "PartPropSvc", "PartPropSvc"}
privateinherited

Handle on the particle property service.

Definition at line 142 of file GenBase.h.

142{this, "PartPropSvc", "PartPropSvc"};

◆ m_rejectedAll

double BSignalFilter::m_rejectedAll
private

Definition at line 53 of file BSignalFilter.h.

◆ m_rejectedTrigger

double BSignalFilter::m_rejectedTrigger
private

Definition at line 52 of file BSignalFilter.h.

◆ m_TotalInvMass_switch

bool BSignalFilter::m_TotalInvMass_switch
private

Definition at line 42 of file BSignalFilter.h.

◆ m_TotalInvMassMax

double BSignalFilter::m_TotalInvMassMax
private

Definition at line 58 of file BSignalFilter.h.

◆ m_TotalInvMassMin

double BSignalFilter::m_TotalInvMassMin
private

Definition at line 58 of file BSignalFilter.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: