26 std::vector<ElementLink<xAOD::PFOContainer>>
empty;
32 return StatusCode::SUCCESS;
36 std::vector<const xAOD::PFO*> shotPFOs;
41 shotPFOs.push_back(shotPFO);
45 std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap =
getShotToClusterMap(shotPFOs, pi0ClusterContainer, tau);
56 TLorentzVector clusterP4;
59 clusterP4 = vertexedCluster.
p4();
62 clusterP4 = cluster->p4();
70 neutralPFOContainer.
push_back(neutralPFO);
73 neutralPFO->
setP4(clusterP4.Pt(), clusterP4.Eta(), clusterP4.Phi(), 0.);
84 std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = tau.
vertexedClusters();
86 TLorentzVector clusterP4 = vertexedCluster.p4();
91 double clusterEnergyHad = 0.;
100 for (; cellLink != cellLinks->
end(); ++cellLink) {
103 int sampling = cell->caloDDE()->getSampling();
104 if (sampling < 8)
continue;
107 double cellEnergy = cell->e() * cellLink.
weight();
108 clusterEnergyHad += cellEnergy;
112 if(clusterEnergyHad <= 0.)
continue;
116 hadronicPFOContainer.
push_back(hadronicPFO);
126 return StatusCode::SUCCESS;
134 std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap;
138 int seedHashInt = -1;
139 if (!shotPFO->
attribute(xAOD::PFODetails::PFOAttributes::tauShots_seedHash, seedHashInt)) {
140 ATH_MSG_WARNING(
"Couldn't find seed hash. Set it to -1, no cluster will be associated to shot.");
150 float weightInCluster = -1.;
151 float weightInPreviousCluster = -1;
156 TLorentzVector clusterP4;
159 clusterP4 = vertexedCluster.
p4();
162 clusterP4 = cluster->p4();
165 weightInCluster = -1.;
170 for (; cellLink != cellLinks->
end(); ++cellLink) {
174 if (cell->caloDDE()->calo_hash() != seedHash)
continue;
176 weightInCluster = cellLink.
weight();
181 if (weightInCluster < 0)
continue;
184 if (weightInPreviousCluster < 0) {
187 shotToClusterMap[
index] = cluster;
188 weightInPreviousCluster = weightInCluster;
194 if (weightInCluster > weightInPreviousCluster) {
195 shotToClusterMap[
index] = cluster;
203 return shotToClusterMap;
209 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
211 std::vector<unsigned> shotsMatchedToCluster;
216 if (
iterator == shotToClusterMap.end())
continue;
217 if (
iterator->second != &pi0Cluster)
continue;
219 shotsMatchedToCluster.push_back(
index);
222 return shotsMatchedToCluster;
228 const std::vector<unsigned>& shotsInCluster)
const {
229 int totalPhotons = 0;
234 if (! shotPFO->
attribute(xAOD::PFODetails::PFOAttributes::tauShots_nPhotons, nPhotons)) {
237 totalPhotons += nPhotons;
244 std::vector<int> &nPosECells,
245 float &coreEnergyEM1,
246 std::vector<float> &deltaEtaFirstMom,
247 std::vector<float> &deltaEtaSecondMom)
const {
249 float totalEnergyEM1 = 0.;
250 std::vector<float> totalEnergy (3, 0.);
254 for (; cellLink != cellLinks->
end(); ++cellLink) {
258 int sampling = cell->caloDDE()->getSampling();
259 int layer = sampling%4;
260 if (layer >= 3)
continue;
263 float cellEnergy_weighted = cell->e() * cellLink.
weight();
264 if (cellEnergy_weighted <= 0)
continue;
268 float deltaEta = cell->eta() - cluster.
eta();
270 deltaEtaFirstMom[layer] += deltaEta * cellEnergy_weighted;
271 deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy_weighted;
272 totalEnergy[layer] += cellEnergy_weighted;
275 if (sampling != 1 && sampling != 5)
continue;
277 totalEnergyEM1 += cellEnergy_weighted;
281 if(std::abs(
deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.)
continue;
282 coreEnergyEM1 += cellEnergy_weighted;
285 for (
int layer=0; layer < 3; ++layer) {
286 if (totalEnergy[layer] != 0.) {
287 deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
288 deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
291 deltaEtaFirstMom[layer]=0.;
292 deltaEtaSecondMom[layer]=0.;
296 coreEnergyEM1 = (totalEnergyEM1 > 0.) ? coreEnergyEM1/totalEnergyEM1 : 0.;
303 const std::vector<const xAOD::PFO*>& shotPFOs,
304 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
310 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::nPi0Proto, -1);
313 double CENTER_MAG = 0.0;
317 neutralPFO.
setCenterMag(
static_cast<float>(CENTER_MAG));
321 int NHitsInEM1 =
getNPhotons(shotPFOs, shotsInCluster);
322 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NHitsInEM1, NHitsInEM1);
325 float eEM1 = cluster.
eSample(CaloSampling::EMB1) + cluster.
eSample(CaloSampling::EME1);
326 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM1, eEM1);
328 float eEM2 = cluster.
eSample(CaloSampling::EMB2) + cluster.
eSample(CaloSampling::EME2);
329 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM2, eEM2);
332 std::vector<float> deltaEtaFirstMom (3, 0.);
333 std::vector<float> deltaEtaSecondMom (3, 0.);
334 std::vector<int> nPosECells(3, 0);
335 float EM1CoreFrac = 0.;
337 getClusterVariables(cluster, nPosECells, EM1CoreFrac, deltaEtaFirstMom, deltaEtaSecondMom);
340 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_PS, nPosECells.at(0));
341 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, nPosECells.at(1));
342 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, nPosECells.at(2));
345 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, EM1CoreFrac);
348 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, deltaEtaFirstMom.at(1));
349 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM2, deltaEtaFirstMom.at(2));
352 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, deltaEtaSecondMom.at(1));
353 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, deltaEtaSecondMom.at(2));
358 const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
359 {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
360 {Moment::SECOND_R, Attribute::cellBased_SECOND_R},
361 {Moment::SECOND_LAMBDA, Attribute::cellBased_SECOND_LAMBDA},
362 {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
363 {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
364 {Moment::CENTER_LAMBDA, Attribute::cellBased_CENTER_LAMBDA},
365 {Moment::LATERAL, Attribute::cellBased_LATERAL},
366 {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
367 {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
368 {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
369 {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
370 {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
373 for (
const auto& [moment, attribute] : momentAttributePairs) {
378 neutralPFO.
setAttribute(attribute,
static_cast<float>(value));
387 std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
391 if (!shotElementLink.
isValid()) {
394 shotlinks.push_back(shotElementLink);
400 return StatusCode::SUCCESS;
406 double clusterEnergyHad,
408 double clusterPtHad = clusterEnergyHad/std::cosh(cluster.
eta());
409 hadronicPFO.
setP4(clusterPtHad, cluster.
eta(), cluster.
phi(), 0.);
411 return StatusCode::SUCCESS;
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#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 isValid() const
Test to see if the link can be dereferenced.
bool toContainedElement(BaseConstReference data, ElementType element, IProxyDict *sg=0)
Set from element pointer and a reference to the container (storable)
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
virtual StatusCode executePi0ClusterCreator(xAOD::TauJet &pTau, xAOD::PFOContainer &neutralPFOContainer, xAOD::PFOContainer &hadronicClusterPFOContainer, const xAOD::CaloClusterContainer &pi0CaloClusContainer) const override
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, const xAOD::CaloClusterContainer &pi0ClusterContainer, const xAOD::TauJet &pTau) const
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
std::vector< xAOD::CaloVertexedTopoCluster > vertexedClusters() const
void setHadronicPFOLinks(const PFOLinks_t &hadronicPFOs)
size_t nShotPFOs() const
Get the number of shot PFO particles associated with this tau.
const PFO * shotPFO(size_t i) const
Get the pointer to a given shot PFO associated with this tau.
const PFOLinks_t & shotPFOLinks() const
const Vertex * vertex() const
void setProtoNeutralPFOLinks(const PFOLinks_t &protoNeutralPFOs)
void addHadronicPFOLink(const ElementLink< PFOContainer > &pfo)
add a hadronic PFO to the tau
void addProtoNeutralPFOLink(const ElementLink< PFOContainer > &pfo)
add a cellbased_neutral PFO to the tau
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.