15#include "GaudiKernel/SystemOfUnits.h"
23 std::vector<std::size_t> createVectorFromRanges(
const std::vector<std::pair<std::size_t, std::size_t>> &ranges)
26 std::size_t total = 0;
27 for (
const std::pair<std::size_t, std::size_t> &range : ranges)
29 std::vector<std::size_t>
result(total);
30 auto startItr =
result.begin();
31 auto endItr =
result.begin();
32 for (
const std::pair<std::size_t, std::size_t> &range : ranges)
35 endItr = startItr + (
range.second -
range.first);
36 std::iota(startItr, endItr,
range.first);
41 std::vector<std::size_t> findBinNumbers(
43 const std::vector<std::pair<float, float>> &etaBins,
44 const std::vector<std::pair<float, float>> &phiBins,
47 std::vector<std::size_t> binNumbers;
49 phi = TVector2::Phi_0_2pi(
phi - phiOffset);
50 for (
const std::pair<float, float> &etaBin : etaBins)
52 for (
const std::pair<float, float> &phiBin : phiBins)
57 binNumbers.push_back(iBin);
86 return StatusCode::SUCCESS;
96 std::vector<std::pair<float, float>> etaBins{
103 std::vector<std::pair<float, float>> etaBinsCore{
111 std::vector<std::pair<float, float>> phiBins{
112 {0.0, TMath::Pi()}, {TMath::Pi(), 2 * TMath::Pi()}};
113 float phiOffset = 0.25 * TMath::Pi();
115 std::size_t nBins = etaBins.size() * phiBins.size();
117 std::vector<std::size_t> EMTowers = createVectorFromRanges(
118 {{1, 1696}, {3392, 5088}, {6784, 6816}, {6848, 6880}, {6912, 6976}});
119 std::vector<std::size_t> hadTowers = createVectorFromRanges(
120 {{1696, 3392}, {5088, 6784}, {6816, 6848}, {6880, 6912}});
121 std::vector<std::size_t> FCALTowers = createVectorFromRanges({{6976, 7744}});
124 std::vector<std::size_t> had1Towers;
125 std::vector<std::size_t> had2Towers;
126 std::vector<std::size_t> had3Towers;
127 for (std::size_t idx : hadTowers)
129 float eta = std::abs(towers->at(idx)->eta());
131 had1Towers.push_back(idx);
133 had2Towers.push_back(idx);
135 had3Towers.push_back(idx);
139 std::vector<std::vector<std::size_t>>
regions;
141 regions.push_back(std::move(had1Towers));
142 regions.push_back(std::move(had2Towers));
143 regions.push_back(std::move(had3Towers));
144 regions.push_back(std::move(EMTowers));
145 regions.push_back(std::move(FCALTowers));
150 for (std::size_t regionIdx = 0; regionIdx <
regions.size(); ++regionIdx)
152 for (std::size_t towerIdx :
regions.at(regionIdx))
155 for (std::size_t binIdx : findBinNumbers(tower.
eta(), tower.
phi(), etaBins, phiBins, phiOffset))
156 bins.m_bins.at(binIdx + regionIdx * nBins).push_back(towerIdx);
157 for (std::size_t binIdx : findBinNumbers(tower.
eta(), tower.
phi(), etaBinsCore, phiBins, phiOffset))
158 bins.m_binsCore.at(binIdx + regionIdx * nBins).push_back(towerIdx);
163 for (std::size_t binIdx = 0; binIdx <
bins.m_bins.size(); ++binIdx)
164 if (
bins.m_binsCore.at(binIdx).size() == 0)
165 bins.m_bins.at(binIdx).clear();
173 if (!inputTowers.isValid())
176 return StatusCode::FAILURE;
184 std::vector<float> rhos;
185 rhos.reserve(jFEXBins.
m_bins.size());
186 for (
const std::vector<std::size_t> &binTowerIndices : jFEXBins.
m_bins)
188 std::size_t
count = 0;
190 for (std::size_t towerIdx : binTowerIndices)
193 float area = accArea(*tower);
194 float towerRho = tower->
et() /
area;
204 rhos.push_back(rhoSum /
count);
207 std::vector<float> subtractedTowerEnergies(inputTowers->size(), 0.0);
208 for (std::size_t binIdx = 0; binIdx < jFEXBins.
m_binsCore.size(); ++binIdx)
210 for (std::size_t towerIdx : jFEXBins.
m_binsCore.at(binIdx))
213 float area = accArea(*tower);
214 float etSub = tower->
et() - rhos.at(binIdx) *
area;
217 subtractedTowerEnergies.at(towerIdx) = etSub;
220 for (std::size_t idx = 0; idx < subtractedTowerEnergies.size(); ++idx)
221 outputTowers->at(idx)->setEt(subtractedTowerEnergies.at(idx));
225 ATH_CHECK(outputHandle.record(std::move(outputTowers), std::move(outputTowersAux)));
228 auto rhoCont = std::make_unique<xAOD::EnergySumRoI>();
229 auto rhoContAux = std::make_unique<xAOD::EnergySumRoIAuxInfo>();
230 rhoCont->setStore(rhoContAux.get());
231 decRhos(*rhoCont) = std::move(rhos);
233 ATH_CHECK(outputRhoHandle.record(std::move(rhoCont), std::move(rhoContAux)));
234 return StatusCode::SUCCESS;
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
static const std::vector< std::string > bins
static const std::vector< std::string > regions
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
An algorithm that can be simultaneously executed in multiple threads.
SG::ReadHandleKey< xAOD::JGTowerContainer > m_inputKey
JFEXBins buildFexBins(const xAOD::JGTowerContainer *towers) const
virtual ~JTowerRhoSubtractionAlg() override
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteHandleKey< xAOD::EnergySumRoI > m_outputRhoKey
JTowerRhoSubtractionAlg(const std::string &name, ISvcLocator *pSvcLocator)
float m_minOutputTowerRho
virtual StatusCode initialize() override
SG::WriteHandleKey< xAOD::JGTowerContainer > m_outputKey
Helper class to provide constant type-safe access to aux data.
virtual double phi() const final
The azimuthal angle ( ) of the particle.
virtual double et() const final
virtual double eta() const final
The pseudorapidity ( ) of the particle.
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setPhiMap phiBin
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap etaBin
JGTower_v1 JGTower
Define the latest version of the JGTower class.
ShallowCopyResult_t< T > shallowCopy(const T &cont, const EventContext &ctx)
Create a shallow copy of an existing container.
bool setOriginalObjectLink(const IParticle &original, IParticle ©)
This function should be used by CP tools when they make a deep copy of an object in their correctedCo...
JGTowerContainer_v1 JGTowerContainer
Define the latest version of the JGTower container.
std::vector< std::vector< std::size_t > > m_binsCore
std::vector< std::vector< std::size_t > > m_bins