Belle II Software development
PhysicsObjectsMiraBelleHadronModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <dqm/modules/PhysicsObjectsMiraBelle/PhysicsObjectsMiraBelleHadronModule.h>
10#include <hlt/softwaretrigger/calculations/utilities.h>
11#include <analysis/dataobjects/ParticleList.h>
12#include <analysis/ContinuumSuppression/FoxWolfram.h>
13#include <analysis/utility/PCmsLabTransform.h>
14#include <framework/datastore/StoreObjPtr.h>
15#include <framework/datastore/StoreArray.h>
16#include <mdst/dataobjects/Track.h>
17#include <mdst/dataobjects/SoftwareTriggerResult.h>
18#include <analysis/ClusterUtility/ClusterUtils.h>
19#include <TDirectory.h>
20#include <map>
21
22using namespace Belle2;
23
24REG_MODULE(PhysicsObjectsMiraBelleHadron);
25
27{
28 setDescription("Monitor Physics Objects Quality");
30
31 addParam("TriggerIdentifier", m_triggerIdentifier,
32 "Trigger identifier string used to select events for the histograms", std::string("software_trigger_cut&skim&accept_hadronb2"));
33 addParam("hadronb2piPListName", m_hadpiPListName, "Name of the pi+ particle list", std::string("pi+:hadb2physMiraBelle"));
34}
35
37{
38 TDirectory* oldDir = gDirectory;
39 oldDir->mkdir("PhysicsObjectsMiraBelleHadron");
40 oldDir->cd("PhysicsObjectsMiraBelleHadron");
41
42 // Mass distributions
43 m_h_nECLClusters = new TH1F("hist_nECLClusters", "hist_nECLClusters", 100, 0, 60);
44 m_h_nECLClusters->SetXTitle("hist_nECLClusters");
45 m_h_visibleEnergyCMSnorm = new TH1F("hist_visibleEnergyCMSnorm", "hist_visibleEnergyCMSnorm", 100, 0, 2);
46 m_h_visibleEnergyCMSnorm->SetXTitle("hist_visibleEnergyCMSnorm");
47 m_h_EsumCMSnorm = new TH1F("hist_EsumCMSnorm", "hist_EsumCMSnorm", 100, 0, 2);
48 m_h_EsumCMSnorm->SetXTitle("hist_EsumCMSnorm");
49 m_h_R2 = new TH1F("hist_R2", "hist_R2", 100, 0, 1);
50 m_h_R2->SetXTitle("hist_R2");
51 m_h_physicsresultsH = new TH1F("hist_physicsresultsH", "hist_physicsresultsH", 10, 0, 10);
52 m_h_physicsresultsH->SetXTitle("hist_physicsresultsH");
53 m_h_physicsresultsH->GetXaxis()->SetBinLabel(2, "Hadronb2");
54 m_h_physicsresultsH->GetXaxis()->SetBinLabel(3, "Hadronb2_tight");
55
56 oldDir->cd();
57}
58
59
61{
62 REG_HISTOGRAM
63
65 result.isOptional();
66}
67
69{
70
71 m_h_nECLClusters->Reset();
73 m_h_EsumCMSnorm->Reset();
74 m_h_R2->Reset();
75 m_h_physicsresultsH->Reset();
76}
77
79{
80
82 if (!result.isValid()) {
83 B2WARNING("SoftwareTriggerResult object not available but needed to select events for the histograms.");
84 return;
85 }
86
87 const std::map<std::string, int>& results = result->getResults();
88 if (results.find(m_triggerIdentifier) == results.end()) {
89 B2WARNING("PhysicsObjectsMiraBelleHadron: Can't find trigger identifier: " << m_triggerIdentifier);
90 return;
91 }
92
93 // apply software trigger
94 const bool accepted = (result->getResult(m_triggerIdentifier) == SoftwareTriggerCutResult::c_accept);
95 if (accepted == false) return;
96
97 // Check HLT decision
98 bool HLTAccepted = (result->getResult(std::string("software_trigger_cut&filter&total_result")) ==
100 //Fill entries only when HLT accepted the event
101 if (HLTAccepted)
102 m_h_physicsresultsH->Fill(1);
103
104 // get pi list
106 std::vector<ROOT::Math::PxPyPzEVector> m_pionHad;
107
108 double EsumPiHad = 0.;
109
110 for (unsigned int i = 0; i < hadpiParticles->getListSize(); i++) {
111 const Particle* parPiHad = hadpiParticles->getParticle(i);
112 ROOT::Math::PxPyPzEVector V4PiHad = PCmsLabTransform::labToCms(parPiHad->get4Vector());
113 m_pionHad.push_back(V4PiHad);
114 EsumPiHad += V4PiHad.E();
115
116 }
117 //nECLClustersLE
118 double neclClusters = -1.;
119 double eneclClusters = 0.;
120 StoreArray<ECLCluster> eclClusters;
121 ClusterUtils Cl;
122 double EsumGamma = 0.;
123
124 if (eclClusters.isValid()) {
125 const unsigned int numberOfECLClusters = std::count_if(eclClusters.begin(), eclClusters.end(),
126 [](const ECLCluster & eclcluster) {
127 return (eclcluster.hasHypothesis(ECLCluster::EHypothesisBit::c_nPhotons)
128 and eclcluster.getEnergy(ECLCluster::EHypothesisBit::c_nPhotons) > 0.1);
129 });
130 neclClusters = numberOfECLClusters;
131 for (int ncl = 0; ncl < eclClusters.getEntries(); ncl++) {
132 if (eclClusters[ncl]->hasHypothesis(ECLCluster::EHypothesisBit::c_nPhotons)
133 && eclClusters[ncl]->getEnergy(ECLCluster::EHypothesisBit::c_nPhotons) > 0.1) {
134 eneclClusters += eclClusters[ncl]->getEnergy(ECLCluster::EHypothesisBit::c_nPhotons);
135 if (!eclClusters[ncl]->getRelatedFrom<Track>()) {
136 ROOT::Math::PxPyPzEVector V4Gamma_CMS = PCmsLabTransform::labToCms(Cl.Get4MomentumFromCluster(eclClusters[ncl],
138 EsumGamma += V4Gamma_CMS.E();
139 }
140 }
141 }
142 }
143
144 double visibleEnergyCMSnorm = (EsumPiHad + EsumGamma) / (Belle2::SoftwareTrigger::BeamEnergyCMS() * 2.0);
145 double EsumCMSnorm = eneclClusters / (Belle2::SoftwareTrigger::BeamEnergyCMS() * 2.0);
146 FoxWolfram fw(m_pionHad);
148 double R2 = fw.getR(2);
149
150 m_h_nECLClusters->Fill(neclClusters);
151 m_h_visibleEnergyCMSnorm->Fill(visibleEnergyCMSnorm);
152 m_h_EsumCMSnorm->Fill(EsumCMSnorm);
153 m_h_R2->Fill(R2);
154 bool hadronb_tag = visibleEnergyCMSnorm > 0.4 && EsumCMSnorm > 0.2 && R2 < 0.2;
155 //Fill entries only when HLT accepted the event
156 if (hadronb_tag && HLTAccepted) {
157 m_h_physicsresultsH->Fill(2);
158 }
159
160}
161
162
163
167
171
Class to provide momentum-related information from ECLClusters.
const ROOT::Math::PxPyPzEVector Get4MomentumFromCluster(const ECLCluster *cluster, ECLCluster::EHypothesisBit hypo)
Returns four momentum vector.
ECL cluster data.
Definition ECLCluster.h:27
@ c_nPhotons
CR is split into n photons (N1)
Definition ECLCluster.h:41
Class to calculate the Fox-Wolfram moments up to order 8.
Definition FoxWolfram.h:28
double getR(int i) const
Returns the i-th moment normalized to the 0th-order moment.
Definition FoxWolfram.h:89
void calculateBasicMoments()
Method to perform the calculation of the moments up to order 4, which are the most relevant ones.
Definition FoxWolfram.cc:14
HistoModule()
Constructor.
Definition HistoModule.h:32
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
static ROOT::Math::PxPyPzMVector labToCms(const ROOT::Math::PxPyPzMVector &vec)
Transforms Lorentz vector into CM System.
Class to store reconstructed particles.
Definition Particle.h:76
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
Definition Particle.h:567
void event() override
This method is called for each event.
TH1F * m_h_physicsresultsH
histogram for event results for hadronb2 and hadronb2 tight
void endRun() override
This method is called if the current run ends.
void terminate() override
This method is called at the end of the event processing.
std::string m_triggerIdentifier
Trigger identifier string used to select events for the histograms.
TH1F * m_h_R2
histogram for R2 of hadron events after the hadronb2 selection
std::string m_hadpiPListName
Name of the pi+ particle list.
void beginRun() override
Called when entering a new run.
TH1F * m_h_visibleEnergyCMSnorm
histogram for visible energy of tracks and gammas
TH1F * m_h_EsumCMSnorm
histogram for sum of energy of clusters with E > 0.1
void defineHisto() override
Definition of the histograms.
Accessor to arrays stored in the data store.
Definition StoreArray.h:113
bool isValid() const
Check whether the array was registered.
Definition StoreArray.h:288
int getEntries() const
Get the number of objects in the array.
Definition StoreArray.h:216
iterator end()
Return iterator to last entry +1.
Definition StoreArray.h:320
iterator begin()
Return iterator to first entry.
Definition StoreArray.h:318
Type-safe access to single objects in the data store.
Definition StoreObjPtr.h:96
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.