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);
51 B2DEBUG(28,
"ECLShowerCorrectorModule::initialize()");
54 m_eclShowers.registerInDataStore(eclShowerArrayName());
65 if (m_eclLeakageCorrections.hasChanged()) {
68 std::vector<float> logEnergiesFwd = m_eclLeakageCorrections->getlogEnergiesFwd();
69 std::vector<float> logEnergiesBrl = m_eclLeakageCorrections->getlogEnergiesBrl();
70 std::vector<float> logEnergiesBwd = m_eclLeakageCorrections->getlogEnergiesBwd();
73 nEnergies = logEnergiesBrl.size();
74 B2INFO(
"ECLShowerCorrector beginRun: Number of energies = " << nEnergies);
75 leakLogE.resize(nLeakReg, std::vector<float>(nEnergies, 0.));
78 for (
int ie = 0; ie < nEnergies; ie++) {
79 leakLogE[0][ie] = logEnergiesFwd[ie];
80 leakLogE[1][ie] = logEnergiesBrl[ie];
81 leakLogE[2][ie] = logEnergiesBwd[ie];
85 thetaCorrection = m_eclLeakageCorrections->getThetaCorrections();
86 phiCorrection = m_eclLeakageCorrections->getPhiCorrections();
87 crysCorrection = m_eclLeakageCorrections->getnCrystalCorrections();
90 nPositionBins = thetaCorrection.GetNbinsY();
91 nCrysMax = crysCorrection.GetNbinsY();
92 nXBins = nThetaID * nEnergies;
101 for (
auto& eclShower : m_eclShowers) {
108 const double energyRaw = eclShower.getEnergy();
109 const double energyRawHighest = eclShower.getEnergyHighestCrystal();
112 int nForEnergy = (int)(eclShower.getNumberOfCrystalsForEnergy() + 0.001);
113 const int nCrys = std::min(nCrysMax, nForEnergy);
116 const int icellIDMaxE = eclShower.getCentralCellId();
117 const float thetaLocation = eclShower.getTheta();
118 const float phiLocation = eclShower.getPhi();
122 std::vector<int> positionVector = leakagePosition->getLeakagePosition(icellIDMaxE, thetaLocation, phiLocation, nPositionBins);
123 const int iThetaID = positionVector[1];
124 const int iRegion = positionVector[2];
125 const int iThetaBin = positionVector[3];
126 const int iPhiBin = positionVector[4];
127 const int iPhiMech = positionVector[5];
131 double correction = 0.96;
132 for (
int iter = 0; iter < 2; iter++) {
135 float logEnergy = log(energyRaw / correction);
137 if (logEnergy < leakLogE[iRegion][0]) {
139 }
else if (logEnergy > leakLogE[iRegion][nEnergies - 1]) {
142 while (logEnergy > leakLogE[iRegion][ie0 + 1]) {ie0++;}
147 int iXBin = iThetaID + ie0 * nThetaID + 1;
148 double thetaCor = thetaCorrection.GetBinContent(iXBin, iThetaBin + 1);
149 double phiCor = phiCorrection.GetBinContent(iXBin + iPhiMech * nXBins, iPhiBin + 1);
150 double crysCor = crysCorrection.GetBinContent(iXBin, nCrys + 1);
151 const double cor0 = thetaCor * phiCor * crysCor;
154 iXBin = iThetaID + (ie0 + 1) * nThetaID + 1;
155 thetaCor = thetaCorrection.GetBinContent(iXBin, iThetaBin + 1);
156 phiCor = phiCorrection.GetBinContent(iXBin + iPhiMech * nXBins, iPhiBin + 1);
157 crysCor = crysCorrection.GetBinContent(iXBin, nCrys + 1);
158 const double cor1 = thetaCor * phiCor * crysCor;
161 correction = cor0 + (cor1 - cor0) * (logEnergy - leakLogE[iRegion][ie0]) / (leakLogE[iRegion][ie0 + 1] - leakLogE[iRegion][ie0]);
166 const double correctedEnergy = energyRaw / correction;
167 const double correctedEnergyHighest = energyRawHighest / correction;
168 B2DEBUG(28,
"Correction factor=" << correction <<
", correctedEnergy=" << correctedEnergy <<
", correctedEnergyHighest=" <<
169 correctedEnergyHighest);
172 eclShower.setEnergy(correctedEnergy);
173 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.