27 std::vector<ElementLink<xAOD::PFOContainer>>
empty;
28 tau.setProtoNeutralPFOLinks(
empty);
29 tau.setHadronicPFOLinks(
empty);
33 return StatusCode::SUCCESS;
37 std::vector<const xAOD::PFO*> shotPFOs;
39 unsigned nShots = tau.nShotPFOs();
42 shotPFOs.push_back(shotPFO);
52 std::vector<const xAOD::CaloCluster*> good_pi0s;
53 for (TLorentzVector clusterP4;
const xAOD::CaloCluster* cluster: pi0ClusterContainer){
56 clusterP4 = vertexedCluster.
p4();
59 clusterP4 = cluster->p4();
64 good_pi0s.push_back(cluster);
68 std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap =
getShotToClusterMap(shotPFOs, good_pi0s);
74 clusterP4 = vertexedCluster.
p4();
77 clusterP4 = cluster->p4();
82 neutralPFOContainer.
push_back(neutralPFO);
85 neutralPFO->
setP4(clusterP4.Pt(), clusterP4.Eta(), clusterP4.Phi(), 0.);
90 tau.addProtoNeutralPFOLink(PFOElementLink);
96 std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = tau.vertexedClusters();
98 TLorentzVector clusterP4 = vertexedCluster.p4();
101 if((clusterP4.E()<=0.) || (clusterP4.DeltaR(tauAxis) >
m_maxDeltaRNeutral) )
continue;
103 double clusterEnergyHad = 0.;
111 ATH_MSG_DEBUG(
"The cell links of the tau cluster is unavailable due to reconstruction from AOD");
116 for (; cellLink != cellLinks->
end(); ++cellLink) {
119 int sampling = cell->caloDDE()->getSampling();
120 if (sampling < 8)
continue;
123 double cellEnergy = cell->e() * cellLink.
weight();
124 clusterEnergyHad += cellEnergy;
128 if(clusterEnergyHad <= 0.)
continue;
132 hadronicPFOContainer.
push_back(hadronicPFO);
137 tau.addHadronicPFOLink( PFOElementLink );
142 return StatusCode::SUCCESS;
148 std::vector<const xAOD::CaloCluster*>& goodPi0s)
const {
149 std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap;
153 int seedHashInt = -1;
154 if (!shotPFO->
attribute(xAOD::PFODetails::PFOAttributes::tauShots_seedHash, seedHashInt)) {
155 ATH_MSG_WARNING(
"Couldn't find seed hash. Set it to -1, no cluster will be associated to shot.");
159 float weightInCluster = -1.;
160 float weightInPreviousCluster = -1;
165 weightInCluster = -1.;
169 for (; cellLink != cellLinks->
end(); ++cellLink) {
173 if (cell->caloDDE()->calo_hash() != seedHash)
continue;
175 weightInCluster = cellLink.
weight();
180 if (weightInCluster < 0)
continue;
183 if (weightInPreviousCluster < 0) {
186 shotToClusterMap[
index] = cluster;
187 weightInPreviousCluster = weightInCluster;
193 if (weightInCluster > weightInPreviousCluster) {
194 shotToClusterMap[
index] = cluster;
202 return shotToClusterMap;
208 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
210 std::vector<unsigned> shotsMatchedToCluster;
215 if (
iterator == shotToClusterMap.end())
continue;
216 if (
iterator->second != &pi0Cluster)
continue;
218 shotsMatchedToCluster.push_back(
index);
221 return shotsMatchedToCluster;
227 const std::vector<unsigned>& shotsInCluster)
const {
228 int totalPhotons = 0;
233 if (! shotPFO->
attribute(xAOD::PFODetails::PFOAttributes::tauShots_nPhotons, nPhotons)) {
236 totalPhotons += nPhotons;
243 std::vector<int> &nPosECells,
244 float &coreEnergyEM1,
245 std::vector<float> &deltaEtaFirstMom,
246 std::vector<float> &deltaEtaSecondMom)
const {
248 float totalEnergyEM1 = 0.;
249 std::vector<float> totalEnergy (3, 0.);
253 for (; cellLink != cellLinks->
end(); ++cellLink) {
257 int sampling = cell->caloDDE()->getSampling();
258 int layer = sampling%4;
259 if (layer >= 3)
continue;
262 float cellEnergy_weighted = cell->e() * cellLink.
weight();
263 if (cellEnergy_weighted <= 0)
continue;
267 float deltaEta = cell->eta() - cluster.
eta();
269 deltaEtaFirstMom[layer] += deltaEta * cellEnergy_weighted;
270 deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy_weighted;
271 totalEnergy[layer] += cellEnergy_weighted;
274 if (sampling != 1 && sampling != 5)
continue;
276 totalEnergyEM1 += cellEnergy_weighted;
280 if(std::abs(
deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.)
continue;
281 coreEnergyEM1 += cellEnergy_weighted;
284 for (
int layer=0; layer < 3; ++layer) {
285 if (totalEnergy[layer] != 0.) {
286 deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
287 deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
290 deltaEtaFirstMom[layer]=0.;
291 deltaEtaSecondMom[layer]=0.;
295 coreEnergyEM1 = (totalEnergyEM1 > 0.) ? coreEnergyEM1/totalEnergyEM1 : 0.;
302 const std::vector<const xAOD::PFO*>& shotPFOs,
303 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
309 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::nPi0Proto, -1);
312 double CENTER_MAG = 0.0;
316 neutralPFO.
setCenterMag(
static_cast<float>(CENTER_MAG));
320 int NHitsInEM1 =
getNPhotons(shotPFOs, shotsInCluster);
321 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NHitsInEM1, NHitsInEM1);
324 float eEM1 = cluster.
eSample(CaloSampling::EMB1) + cluster.
eSample(CaloSampling::EME1);
325 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM1, eEM1);
327 float eEM2 = cluster.
eSample(CaloSampling::EMB2) + cluster.
eSample(CaloSampling::EME2);
328 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM2, eEM2);
331 std::vector<float> deltaEtaFirstMom (3, 0.);
332 std::vector<float> deltaEtaSecondMom (3, 0.);
333 std::vector<int> nPosECells(3, 0);
334 float EM1CoreFrac = 0.;
336 getClusterVariables(cluster, nPosECells, EM1CoreFrac, deltaEtaFirstMom, deltaEtaSecondMom);
339 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_PS, nPosECells.at(0));
340 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, nPosECells.at(1));
341 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, nPosECells.at(2));
344 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, EM1CoreFrac);
347 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, deltaEtaFirstMom.at(1));
348 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM2, deltaEtaFirstMom.at(2));
351 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, deltaEtaSecondMom.at(1));
352 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, deltaEtaSecondMom.at(2));
357 const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
358 {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
359 {Moment::SECOND_R, Attribute::cellBased_SECOND_R},
360 {Moment::SECOND_LAMBDA, Attribute::cellBased_SECOND_LAMBDA},
361 {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
362 {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
363 {Moment::CENTER_LAMBDA, Attribute::cellBased_CENTER_LAMBDA},
364 {Moment::LATERAL, Attribute::cellBased_LATERAL},
365 {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
366 {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
367 {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
368 {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
369 {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
372 for (
const auto& [moment, attribute] : momentAttributePairs) {
377 neutralPFO.
setAttribute(attribute,
static_cast<float>(value));
386 std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
388 auto& shotPFOElementLink = tau.shotPFOLinks().at(shotsInCluster.at(
index));
390 if (!shotElementLink.
isValid()) {
393 shotlinks.push_back(shotElementLink);
399 return StatusCode::SUCCESS;
405 double clusterEnergyHad,
407 double clusterPtHad = clusterEnergyHad/std::cosh(cluster.
eta());
408 hadronicPFO.
setP4(clusterPtHad, cluster.
eta(), cluster.
phi(), 0.);
410 return StatusCode::SUCCESS;
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
static const Attributes_t empty
Data object for each calorimeter readout cell.
const_iterator to loop over cells belonging to a cluster
weight_t weight() const
Accessor for weight associated to this cell.
Bookkeeping of cells that make up a cluster Simplified replacement for CaloCellLink,...
const_iterator end() const
const end method
const_iterator begin() const
const begin method
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ElementLink implementation for ROOT usage.
bool toContainedElement(BaseConstReference container, ElementType element)
Set link to point to given element (slowest).
bool isValid() const
Check if the element can be found.
This is a "hash" representation of an Identifier.
Gaudi::Property< double > m_maxDeltaRJetClust
void getClusterVariables(const xAOD::CaloCluster &cluster, std::vector< int > &nPosECells, float &coreEnergyEM1, std::vector< float > &deltaEtaFirstMom, std::vector< float > &secondEtaWRTClusterPositionInLayer) const
eta moment in PS, EM1 and EM2 w.r.t cluster eta
StatusCode configureNeutralPFO(const xAOD::CaloCluster &cluster, const xAOD::CaloClusterContainer &pi0ClusterContainer, const xAOD::TauJet &tau, const std::vector< const xAOD::PFO * > &shotPFOs, const std::map< unsigned, const xAOD::CaloCluster * > &shotsInCluster, xAOD::PFO &neutralPFO) const
Configure the neutral PFO.
Gaudi::Property< double > m_clusterEtCut
Gaudi::Property< double > m_recoFromAOD
StatusCode configureHadronicPFO(const xAOD::CaloVertexedTopoCluster &cluster, double clusterEnergyHad, xAOD::PFO &hadronicPFO) const
Configure the haronic PFO.
Gaudi::Property< double > m_maxDeltaRNeutral
std::map< unsigned, const xAOD::CaloCluster * > getShotToClusterMap(const std::vector< const xAOD::PFO * > &shotVector, std::vector< const xAOD::CaloCluster * > &goodpi0Vecor) const
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::PFOContainer &neutralPFOContainer, xAOD::PFOContainer &hadronicClusterPFOContainer, const xAOD::CaloClusterContainer &pi0CaloClusContainer) const override
std::vector< unsigned > getShotsMatchedToCluster(const std::vector< const xAOD::PFO * > &shotVector, const std::map< unsigned, const xAOD::CaloCluster * > &clusterToShotMap, const xAOD::CaloCluster &pi0Cluster) const
int getNPhotons(const std::vector< const xAOD::PFO * > &shotVector, const std::vector< unsigned > &shotsInCluster) const
TauPi0ClusterCreator(const std::string &name)
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version).
virtual double eta() const
The pseudorapidity ( ) of the particle.
float eSample(const CaloSample sampling) const
virtual double phi() const
The azimuthal angle ( ) of the particle.
MomentType
Enums to identify different moments.
@ CENTER_MAG
Cluster Centroid ( ).
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
virtual double phi() const final
The azimuthal angle ( ) of the particle.
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
void setAttribute(PFODetails::PFOAttributes AttributeType, const T &anAttribute)
Set a PFO Variable via enum - overwrite is allowed.
bool setAssociatedParticleLinks(PFODetails::PFOParticleType ParticleType, const std::vector< ElementLink< IParticleContainer > > &theParticles)
Set a vector of PFO constituent particle types via enum - overwrite is allowed.
bool setClusterLink(const ElementLink< xAOD::CaloClusterContainer > &theCluster)
Set a cluster constituent - does NOT append to existing container.
void setCenterMag(float CenterMag)
set CenterMag moment needed for vertex correction
void setP4(const FourMom_t &vec)
set the 4-vec
void setBDTPi0Score(float BDTPi0Score)
set BDT Score used to classify clusters as Pi0 like or not
void setCharge(float charge)
set charge of PFO
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
PFO_v1 PFO
Definition of the current "pfo version".
PFOContainer_v1 PFOContainer
Definition of the current "pfo container version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauJet_v3 TauJet
Definition of the current "tau version".
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.