10 #include <ecl/modules/eclShowerCorrection/ECLShowerCorrectorModule.h>
13 #include <framework/logging/Logger.h>
16 #include <ecl/dbobjects/ECLLeakageCorrections.h>
17 #include <ecl/dataobjects/ECLShower.h>
18 #include <ecl/geometry/ECLLeakagePosition.h>
34 m_eclShowers(eclShowerArrayName()),
39 setDescription(
"ECLShowerCorrectorModule: Corrects energy of ECLShowers and highest energy crystal for shower leakage, beam backgrounds, and clustering");
40 setPropertyFlags(c_ParallelProcessingCertified);
46 if (m_leakagePosition !=
nullptr)
47 delete m_leakagePosition;
52 B2DEBUG(28,
"ECLShowerCorrectorModule::initialize()");
55 m_eclShowers.registerInDataStore(eclShowerArrayName());
66 if (m_eclLeakageCorrections.hasChanged()) {
69 std::vector<float> logEnergiesFwd = m_eclLeakageCorrections->getlogEnergiesFwd();
70 std::vector<float> logEnergiesBrl = m_eclLeakageCorrections->getlogEnergiesBrl();
71 std::vector<float> logEnergiesBwd = m_eclLeakageCorrections->getlogEnergiesBwd();
74 nEnergies = logEnergiesBrl.size();
75 B2INFO(
"ECLShowerCorrector beginRun: Number of energies = " << nEnergies);
76 leakLogE.resize(nLeakReg, std::vector<float>(nEnergies, 0.));
79 for (
int ie = 0; ie < nEnergies; ie++) {
80 leakLogE[0][ie] = logEnergiesFwd[ie];
81 leakLogE[1][ie] = logEnergiesBrl[ie];
82 leakLogE[2][ie] = logEnergiesBwd[ie];
86 thetaCorrection = m_eclLeakageCorrections->getThetaCorrections();
87 phiCorrection = m_eclLeakageCorrections->getPhiCorrections();
88 crysCorrection = m_eclLeakageCorrections->getnCrystalCorrections();
91 nPositionBins = thetaCorrection.GetNbinsY();
92 nCrysMax = crysCorrection.GetNbinsY();
93 nXBins = nThetaID * nEnergies;
102 for (
auto& eclShower : m_eclShowers) {
109 const double energyRaw = eclShower.getEnergy();
110 const double energyRawHighest = eclShower.getEnergyHighestCrystal();
113 int nForEnergy = (int)(eclShower.getNumberOfCrystalsForEnergy() + 0.001);
114 const int nCrys = std::min(nCrysMax, nForEnergy);
117 const int icellIDMaxE = eclShower.getCentralCellId();
118 const float thetaLocation = eclShower.getTheta();
119 const float phiLocation = eclShower.getPhi();
123 std::vector<int> positionVector = m_leakagePosition->getLeakagePosition(icellIDMaxE, thetaLocation, phiLocation, nPositionBins);
124 const int iThetaID = positionVector[1];
125 const int iRegion = positionVector[2];
126 const int iThetaBin = positionVector[3];
127 const int iPhiBin = positionVector[4];
128 const int iPhiMech = positionVector[5];
132 double correction = 0.96;
133 for (
int iter = 0; iter < 2; iter++) {
136 float logEnergy = log(energyRaw / correction);
138 if (logEnergy < leakLogE[iRegion][0]) {
140 }
else if (logEnergy > leakLogE[iRegion][nEnergies - 1]) {
143 while (logEnergy > leakLogE[iRegion][ie0 + 1]) {ie0++;}
148 int iXBin = iThetaID + ie0 * nThetaID + 1;
149 double thetaCor = thetaCorrection.GetBinContent(iXBin, iThetaBin + 1);
150 double phiCor = phiCorrection.GetBinContent(iXBin + iPhiMech * nXBins, iPhiBin + 1);
151 double crysCor = crysCorrection.GetBinContent(iXBin, nCrys + 1);
152 const double cor0 = thetaCor * phiCor * crysCor;
155 iXBin = iThetaID + (ie0 + 1) * nThetaID + 1;
156 thetaCor = thetaCorrection.GetBinContent(iXBin, iThetaBin + 1);
157 phiCor = phiCorrection.GetBinContent(iXBin + iPhiMech * nXBins, iPhiBin + 1);
158 crysCor = crysCorrection.GetBinContent(iXBin, nCrys + 1);
159 const double cor1 = thetaCor * phiCor * crysCor;
162 correction = cor0 + (cor1 - cor0) * (logEnergy - leakLogE[iRegion][ie0]) / (leakLogE[iRegion][ie0 + 1] - leakLogE[iRegion][ie0]);
167 const double correctedEnergy = energyRaw / correction;
168 const double correctedEnergyHighest = energyRawHighest / correction;
169 B2DEBUG(28,
"Correction factor=" << correction <<
", correctedEnergy=" << correctedEnergy <<
", correctedEnergyHighest=" <<
170 correctedEnergyHighest);
173 eclShower.setEnergy(correctedEnergy);
174 eclShower.setEnergyHighestCrystal(correctedEnergyHighest);
DB object to store leakage corrections, including nCrys dependence
Class to perform the shower correction.
virtual void initialize() override
Initialize.
virtual void event() override
Event.
virtual void endRun() override
End run.
virtual void terminate() override
Terminate.
~ECLShowerCorrectorModule()
Destructor.
virtual void beginRun() override
Begin run.
@ c_nPhotons
CR is split into n photons (N1)
Class to get position information for a cluster for leakage corrections.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.