Belle II Software  release-05-02-19
ECLTriggerClusterMatcherModule.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Torben Ferber (ferber) *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 //This module
11 #include <ecl/modules/eclTriggerClusterMatcher/ECLTriggerClusterMatcherModule.h>
12 
13 //Framework
14 #include <framework/geometry/B2Vector3.h>
15 
16 //MDST
17 #include <mdst/dataobjects/ECLCluster.h>
18 
19 //Trg
20 #include <trg/ecl/dataobjects/TRGECLCluster.h>
21 
22 
23 using namespace Belle2;
24 using namespace std;
25 
26 //-----------------------------------------------------------------
27 // Register the Module
28 //-----------------------------------------------------------------
29 REG_MODULE(ECLTriggerClusterMatcher)
30 
31 //-----------------------------------------------------------------
32 // Implementation
33 //-----------------------------------------------------------------
34 
36 {
37  // Set module properties
38  setDescription("Match ECLTRGClusters to ECLClusters");
39  addParam("minClusterEnergy", m_minClusterEnergy, "Minimum energy of the ECLCluster to be checked [GeV].", 0.1);
40  addParam("maxAngle", m_maxAngle, "Maximum angle between an ECLCLuster and an ECLTRGCluster [rad]", 0.15);
41  addParam("minFracEnergy", m_minFracEnergy, "Minimum energy fraction trg/cluster.", 0.);
42  addParam("maxFracEnergy", m_maxFracEnergy, "Maximal energy fraction trg/cluster.", 2.);
43  setPropertyFlags(c_ParallelProcessingCertified);
44 }
45 
47 {
48  m_eclClusters.isRequired();
49  m_eclTriggers.isRequired();
50  m_eclClusters.registerRelationTo(m_eclTriggers);
51 }
52 
54 {
55  for (auto& eclcluster : m_eclClusters) {
56  const double eclclusterTheta = eclcluster.getTheta();
57  const double eclclusterPhi = eclcluster.getPhi();
58 
59  double eclclusterE = 0.0;
60  if (eclcluster.hasHypothesis(ECLCluster::EHypothesisBit::c_nPhotons)) {
61  eclclusterE = eclcluster.getEnergy(ECLCluster::EHypothesisBit::c_nPhotons);
62  } else if (eclcluster.hasHypothesis(ECLCluster::EHypothesisBit::c_neutralHadron)) {
63  eclclusterE = eclcluster.getEnergy(ECLCluster::EHypothesisBit::c_neutralHadron);
64  } else continue;
65 
66  // Users can re-run this with different settings, remove this bit.
67  eclcluster.removeStatus(ECLCluster::EStatusBit::c_TriggerCluster);
68 
69  // Add status bit that shows that the matcher has run
71 
72  if (eclclusterE < m_minClusterEnergy) continue; // skip low energy cluster
73 
74  // Lets ignore any problems from particle from non-IP locations.
75  B2Vector3D cluster(1., 1., 1);
76  cluster.SetTheta(eclclusterTheta);
77  cluster.SetPhi(eclclusterPhi);
78 
79  for (const auto& ecltrigger : m_eclTriggers) {
80  const double ecltriggerX = ecltrigger.getPositionX();
81  const double ecltriggerY = ecltrigger.getPositionY();
82  const double ecltriggerZ = ecltrigger.getPositionZ();
83  const double ecltriggerE = ecltrigger.getEnergyDep();
84 
85  B2Vector3D trigger(ecltriggerX, ecltriggerY, ecltriggerZ);
86 
87  const double angle = cluster.Angle(trigger);
88 
89  double fracEnergy = -1.;
90  if (eclclusterE > 0.0) fracEnergy = ecltriggerE / eclclusterE;
91 
92  // set relation(s) and status bit
93  if (angle < m_maxAngle and fracEnergy > m_minFracEnergy and fracEnergy < m_maxFracEnergy) {
94  eclcluster.addStatus(ECLCluster::EStatusBit::c_TriggerCluster);
95  eclcluster.addRelationTo(&ecltrigger);
96  }
97 
98  }
99  }
100 }
Belle2::ECLCluster::EStatusBit::c_TriggerCluster
@ c_TriggerCluster
bit 0: ECLCluster is matched to a ECL trigger cluster
Belle2::ECLTriggerClusterMatcherModule::initialize
virtual void initialize() override
Register input and output data.
Definition: ECLTriggerClusterMatcherModule.cc:46
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::ECLCluster::EStatusBit::c_TriggerClusterMatching
@ c_TriggerClusterMatching
bit 1: ECLCluster to ECLTRGCluster matcher was run
Belle2::ECLCluster::EHypothesisBit::c_nPhotons
@ c_nPhotons
CR is split into n photons (N1)
Belle2::ECLTriggerClusterMatcherModule::event
virtual void event() override
Event.
Definition: ECLTriggerClusterMatcherModule.cc:53
Belle2::B2Vector3< double >
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ECLCluster::EHypothesisBit::c_neutralHadron
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
Belle2::ECLTriggerClusterMatcherModule
Match ECLTRGClusters to ECLClusters.
Definition: ECLTriggerClusterMatcherModule.h:37