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 = cell->e();
264 float cellEnergy_weighted = cellEnergy * cellLink.
weight();
265 if (cellEnergy <= 0 && cellEnergy_weighted <= 0)
continue;
267 float deltaEta = cell->eta() - cluster.
eta();
272 deltaEtaFirstMom[layer] += deltaEta * cellEnergy;
273 deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy;
274 totalEnergy[layer] += cellEnergy;
278 if (sampling != 1 && sampling != 5)
continue;
280 if( cellEnergy_weighted > 0){
282 totalEnergyEM1 += cellEnergy_weighted;
286 if(std::abs(
deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.)
continue;
287 coreEnergyEM1 += cellEnergy_weighted;
291 for (
int layer=0; layer < 3; ++layer) {
292 if (totalEnergy[layer] != 0.) {
293 deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
294 deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
297 deltaEtaFirstMom[layer]=0.;
298 deltaEtaSecondMom[layer]=0.;
302 coreEnergyEM1 = (totalEnergyEM1 > 0.) ? coreEnergyEM1/totalEnergyEM1 : 0.;
309 const std::vector<const xAOD::PFO*>& shotPFOs,
310 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
316 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::nPi0Proto, -1);
319 double CENTER_MAG = 0.0;
323 neutralPFO.
setCenterMag(
static_cast<float>(CENTER_MAG));
327 int NHitsInEM1 =
getNPhotons(shotPFOs, shotsInCluster);
328 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NHitsInEM1, NHitsInEM1);
331 float eEM1 = cluster.
eSample(CaloSampling::EMB1) + cluster.
eSample(CaloSampling::EME1);
332 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM1, eEM1);
334 float eEM2 = cluster.
eSample(CaloSampling::EMB2) + cluster.
eSample(CaloSampling::EME2);
335 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM2, eEM2);
338 std::vector<float> deltaEtaFirstMom (3, 0.);
339 std::vector<float> deltaEtaSecondMom (3, 0.);
340 std::vector<int> nPosECells(3, 0);
341 float EM1CoreFrac = 0.;
343 getClusterVariables(cluster, nPosECells, EM1CoreFrac, deltaEtaFirstMom, deltaEtaSecondMom);
346 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_PS, nPosECells.at(0));
347 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, nPosECells.at(1));
348 neutralPFO.
setAttribute<
int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, nPosECells.at(2));
351 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, EM1CoreFrac);
354 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, deltaEtaFirstMom.at(1));
355 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM2, deltaEtaFirstMom.at(2));
358 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, deltaEtaSecondMom.at(1));
359 neutralPFO.
setAttribute<
float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, deltaEtaSecondMom.at(2));
364 const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
365 {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
366 {Moment::SECOND_R, Attribute::cellBased_SECOND_R},
367 {Moment::SECOND_LAMBDA, Attribute::cellBased_SECOND_LAMBDA},
368 {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
369 {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
370 {Moment::CENTER_LAMBDA, Attribute::cellBased_CENTER_LAMBDA},
371 {Moment::LATERAL, Attribute::cellBased_LATERAL},
372 {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
373 {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
374 {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
375 {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
376 {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
379 for (
const auto& [moment, attribute] : momentAttributePairs) {
384 neutralPFO.
setAttribute(attribute,
static_cast<float>(value));
393 std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
397 if (!shotElementLink.
isValid()) {
400 shotlinks.push_back(shotElementLink);
406 return StatusCode::SUCCESS;
412 double clusterEnergyHad,
414 double clusterPtHad = clusterEnergyHad/std::cosh(cluster.
eta());
415 hadronicPFO.
setP4(clusterPtHad, cluster.
eta(), cluster.
phi(), 0.);
417 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.