104 StatusCode VertexDecoratorAlg ::execute(
const EventContext& ctx)
152 auto mpCont = std::make_unique<xAOD::CompositeParticleContainer>();
153 auto mpAux = std::make_unique<xAOD::CompositeParticleAuxContainer>();
154 mpCont->setStore(mpAux.get());
162 const bool haveCaloPointingDecor = acc_caloPointingZ.
isAvailable();
164 if (photonsIn->size() > 1 && (!haveZCommonDecor || !haveCaloPointingDecor))
166 ATH_MSG_ERROR(
"photonsIn has size > 1 but required decorations are missing: "
169 return StatusCode::FAILURE;
172 if (photonsIn->size() > 1)
178 TLorentzVector p4sum;
182 const float zCommon = acc_zCommon(*ph);
183 const float zCaloPointing = acc_caloPointingZ(*ph);
185 const bool useZCommonValue = std::isfinite(zCommon);
186 const float z = useZCommonValue ? zCommon : zCaloPointing;
187 if (!std::isfinite(
z)) {
188 ATH_MSG_ERROR(
"Non-finite photon pointing values found in both "
190 return StatusCode::FAILURE;
196 if (useZCommonValue) {
197 const float s = acc_zCommonError(*ph);
198 if (std::isfinite(s) && s > 0.0f) w = 1.0 / (double(s) * double(s));
207 if (nUsed > 1 && sumW > 0.0)
209 const float zPoint = sumWZ / sumW;
212 float bestAbsDZ = 1e30;
217 const float dz = zPoint - vtx->z();
218 const float adz = std::abs(dz);
230 mpCont->push_back(mp);
234 SG::AuxElement::Decorator<float> dec_mp_deltaZ(
"deltaZ");
235 SG::AuxElement::Decorator<float> dec_mp_deltaPhi(
"deltaPhi");
236 SG::AuxElement::Decorator<int> dec_mp_nPhotons(
"nPhotons");
237 SG::AuxElement::Decorator<float> dec_mp_zPointing(
"zPointing");
239 const float deltaZ = zPoint - bestVtxForMP->
z();
240 dec_mp_deltaZ(*mp) = deltaZ;
241 dec_mp_zPointing(*mp) = zPoint;
242 dec_mp_nPhotons(*mp) =
static_cast<int>(photonsIn->size());
247 dphi = acc_deltaPhi(*bestVtxForMP);
248 if (!std::isfinite(dphi)) dphi = 0.0f;
250 dec_mp_deltaPhi(*mp) = dphi;
262 std::map< const xAOD::Vertex*, std::vector<ElementLink<xAOD::JetContainer>> > jetsInVertex;
263 std::map< const xAOD::Jet*, std::map< const xAOD::Vertex*, int> > jetVertexPt;
267 jetsInVertex[vertex] = {};
269 jetVertexPt[
jet][vertex] = 0;
279 if( !jtrk )
continue;
281 if(jetTrackVertex) jetVertexPt[
jet][*jetTrackVertex] += jtrk->pt();
285 float maxPtFrac = -1;
289 if(jetVertexPt[
jet][vertex] > maxPtFrac){
290 maxPtFrac = jetVertexPt[
jet][vertex];
291 uniqueVertexAddress = vertex;
299 jetsInVertex[uniqueVertexAddress].push_back(jetLink);
307 if (vertex->nTrackParticles() < 2)
310 dec_actualInterPerXing(*vertex) = eventInfo->actualInteractionsPerCrossing();
317 float weighted_sumDZ = 0;
318 float weighted_deltaZ = 0;
319 float weighted_modsumDZ = 0;
320 float weighted_z_asym = 0;
323 std::vector<float> track_deltaZ;
325 for (
size_t i = 0; i < vertex->nTrackParticles(); i++) {
329 if(!trackTmp)
continue;
331 deltaZ = trackTmp->
z0() + trackTmp->
vz() - vertex->z();
332 track_deltaZ.push_back(deltaZ);
334 float trk_weight = vertex->trackWeight(i);
335 weighted_deltaZ = deltaZ * trk_weight;
338 modsumDZ += std::abs(deltaZ);
339 weighted_sumDZ += weighted_deltaZ;
340 weighted_modsumDZ += std::abs(weighted_deltaZ);
344 z_asym = sumDZ / modsumDZ;
346 if (weighted_modsumDZ > 0) {
347 weighted_z_asym = weighted_sumDZ / weighted_modsumDZ;
350 const float number_tracks = track_deltaZ.size();
351 const float mean_Dz =
352 number_tracks > 0 ? sumDZ / number_tracks : 0.F;
358 for (
auto i : track_deltaZ)
360 float z_zbar = (i - mean_Dz);
361 z_var += std::pow(z_zbar, 2);
362 z_skew += std::pow(z_zbar, 3);
363 z_kurt += std::pow(z_zbar, 4);
365 if (number_tracks > 1 && z_var > 0) {
366 z_var /= (number_tracks - 1);
367 float z_sd = std::sqrt(z_var);
368 const float skew_denom = (number_tracks - 1) * std::pow(z_sd, 3);
369 const float kurt_denom = (number_tracks - 1) * std::pow(z_sd, 4);
370 if (std::isfinite(skew_denom) && skew_denom != 0.F) {
371 z_skew /= skew_denom;
375 if (std::isfinite(kurt_denom) && kurt_denom != 0.F) {
376 z_kurt /= kurt_denom;
388 dec_ntrk(*vertex) = number_tracks;
393 const float numberDoF = vertex->numberDoF();
394 dec_chi2Over_ndf(*vertex) =
395 numberDoF > 0.F ? vertex->chiSquared() / numberDoF : 0.F;
396 dec_z_asym(*vertex) = z_asym;
397 dec_weighted_z_asym(*vertex) = weighted_z_asym;
398 dec_z_kurt(*vertex) = z_kurt;
399 dec_z_skew(*vertex) = z_skew;
401 if (acc_deltaZ.
isAvailable() && photonsIn->size() > 0 ) {
403 if (!std::isfinite(acc_deltaZ(*vertex))) {
405 dec_photon_deltaz(*vertex) = -1;
408 dec_photon_deltaz(*vertex) = acc_deltaZ(*vertex);
412 dec_photon_deltaz(*vertex) = -1;
414 if (acc_deltaPhi.
isAvailable() && photonsIn->size() > 0) {
416 if (!std::isfinite(acc_deltaPhi(*vertex))) {
418 dec_photon_deltaPhi(*vertex) = -1;
421 dec_photon_deltaPhi(*vertex) = acc_deltaPhi(*vertex);
425 dec_photon_deltaPhi(*vertex) = -1;
429 auto countValid = [](
const auto& links) ->
int {
431 for (
const auto& l : links)
if (l.isValid()) ++n;
435 std::vector<ElementLink<xAOD::ElectronContainer>> electronLinks;
438 if(!id_trk)
continue;
440 if(!eleVertex)
continue;
442 if(*eleVertex == vertex){
445 electronLinks.push_back(elLink);
448 dec_electronLinks(*vertex) = electronLinks;
449 dec_nElectrons(*vertex) = countValid(electronLinks);
451 std::vector<ElementLink<xAOD::PhotonContainer>> photonLinks;
456 photonLinks.push_back(phLink);
458 dec_photonLinks(*vertex) = photonLinks;
459 dec_nPhotons(*vertex) = countValid(photonLinks);
462 std::vector<ElementLink<xAOD::CompositeParticleContainer>> mpLinks;
463 if (haveMP && vertex == bestVtxForMP)
465 mpLinks.push_back(mpLink);
467 dec_multiPhotonLinks(*vertex) = mpLinks;
470 dec_jetLinks(*vertex) = jetsInVertex[vertex];
471 dec_nJets(*vertex) = countValid(jetsInVertex[vertex]);
473 std::vector<ElementLink<xAOD::MuonContainer>> muonLinks;
475 const auto *tp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
479 if(!muonVertex)
continue;
481 if(*muonVertex == vertex){
484 muonLinks.push_back(muonLink);
487 ATH_MSG_DEBUG(
"Skipping muon as the track is not associated to any PV ");
488 ATH_MSG_DEBUG(
"Muon pT, eta = " << muon->pt() <<
" " << muon->eta());
492 dec_muonLinks(*vertex) = muonLinks;
493 dec_nMuons(*vertex) = countValid(muonLinks);
496 float score_phsvertex =
m_gnnTool->decorate(*vertex);
498 dec_gnnScore(*vertex) = score_phsvertex;
501 return StatusCode::SUCCESS;
float vz() const
The z origin for the parameters.