98 StatusCode VertexDecoratorAlg ::execute()
100 const EventContext &ctx = Gaudi::Hive::currentContext();
141 auto mpCont = std::make_unique<xAOD::CompositeParticleContainer>();
142 auto mpAux = std::make_unique<xAOD::CompositeParticleAuxContainer>();
143 mpCont->setStore(mpAux.get());
151 const bool haveCaloPointingDecor = acc_caloPointingZ.
isAvailable();
153 if (photonsIn->size() > 1 && (!haveZCommonDecor || !haveCaloPointingDecor))
155 ATH_MSG_ERROR(
"photonsIn has size > 1 but required decorations are missing: "
158 return StatusCode::FAILURE;
161 if (photonsIn->size() > 1)
167 TLorentzVector p4sum;
171 const float zCommon = acc_zCommon(*ph);
172 const float zCaloPointing = acc_caloPointingZ(*ph);
174 const bool useZCommonValue = std::isfinite(zCommon);
175 const float z = useZCommonValue ? zCommon : zCaloPointing;
176 if (!std::isfinite(
z)) {
177 ATH_MSG_ERROR(
"Non-finite photon pointing values found in both "
179 return StatusCode::FAILURE;
185 if (useZCommonValue) {
186 const float s = acc_zCommonError(*ph);
187 if (std::isfinite(s) && s > 0.0f) w = 1.0 / (double(s) * double(s));
196 if (nUsed > 1 && sumW > 0.0)
198 const float zPoint = sumWZ / sumW;
201 float bestAbsDZ = 1e30;
206 const float dz = zPoint - vtx->z();
207 const float adz = std::abs(dz);
219 mpCont->push_back(mp);
223 SG::AuxElement::Decorator<float> dec_mp_deltaZ(
"deltaZ");
224 SG::AuxElement::Decorator<float> dec_mp_deltaPhi(
"deltaPhi");
225 SG::AuxElement::Decorator<int> dec_mp_nPhotons(
"nPhotons");
226 SG::AuxElement::Decorator<float> dec_mp_zPointing(
"zPointing");
228 const float deltaZ = zPoint - bestVtxForMP->
z();
229 dec_mp_deltaZ(*mp) = deltaZ;
230 dec_mp_zPointing(*mp) = zPoint;
231 dec_mp_nPhotons(*mp) =
static_cast<int>(photonsIn->size());
236 dphi = acc_deltaPhi(*bestVtxForMP);
237 if (!std::isfinite(dphi)) dphi = 0.0f;
239 dec_mp_deltaPhi(*mp) = dphi;
251 std::map< const xAOD::Vertex*, std::vector<ElementLink<xAOD::JetContainer>> > jetsInVertex;
252 std::map< const xAOD::Jet*, std::map< const xAOD::Vertex*, int> > jetVertexPt;
256 jetsInVertex[vertex] = {};
258 jetVertexPt[
jet][vertex] = 0;
268 if( !jtrk )
continue;
270 if(jetTrackVertex) jetVertexPt[
jet][*jetTrackVertex] += jtrk->pt();
274 float maxPtFrac = -1;
278 if(jetVertexPt[
jet][vertex] > maxPtFrac){
279 maxPtFrac = jetVertexPt[
jet][vertex];
280 uniqueVertexAddress = vertex;
288 jetsInVertex[uniqueVertexAddress].push_back(jetLink);
296 if (vertex->nTrackParticles() < 2)
299 dec_actualInterPerXing(*vertex) = eventInfo->actualInteractionsPerCrossing();
306 float weighted_sumDZ = 0;
307 float weighted_deltaZ = 0;
308 float weighted_modsumDZ = 0;
309 float weighted_z_asym = 0;
312 std::vector<float> track_deltaZ;
314 for (
size_t i = 0; i < vertex->nTrackParticles(); i++) {
318 if(!trackTmp)
continue;
320 deltaZ = trackTmp->
z0() + trackTmp->
vz() - vertex->z();
321 track_deltaZ.push_back(deltaZ);
323 float trk_weight = vertex->trackWeight(i);
324 weighted_deltaZ = deltaZ * trk_weight;
327 modsumDZ += std::abs(deltaZ);
328 weighted_sumDZ += weighted_deltaZ;
329 weighted_modsumDZ += std::abs(weighted_deltaZ);
333 z_asym = sumDZ / modsumDZ;
335 if (weighted_modsumDZ > 0) {
336 weighted_z_asym = weighted_sumDZ / weighted_modsumDZ;
339 const float number_tracks = track_deltaZ.size();
340 const float mean_Dz =
341 number_tracks > 0 ? sumDZ / number_tracks : 0.F;
347 for (
auto i : track_deltaZ)
349 float z_zbar = (i - mean_Dz);
350 z_var += std::pow(z_zbar, 2);
351 z_skew += std::pow(z_zbar, 3);
352 z_kurt += std::pow(z_zbar, 4);
354 if (number_tracks > 1 && z_var > 0) {
355 z_var /= (number_tracks - 1);
356 float z_sd = std::sqrt(z_var);
357 const float skew_denom = (number_tracks - 1) * std::pow(z_sd, 3);
358 const float kurt_denom = (number_tracks - 1) * std::pow(z_sd, 4);
359 if (std::isfinite(skew_denom) && skew_denom != 0.F) {
360 z_skew /= skew_denom;
364 if (std::isfinite(kurt_denom) && kurt_denom != 0.F) {
365 z_kurt /= kurt_denom;
377 dec_ntrk(*vertex) = number_tracks;
382 const float numberDoF = vertex->numberDoF();
383 dec_chi2Over_ndf(*vertex) =
384 numberDoF > 0.F ? vertex->chiSquared() / numberDoF : 0.F;
385 dec_z_asym(*vertex) = z_asym;
386 dec_weighted_z_asym(*vertex) = weighted_z_asym;
387 dec_z_kurt(*vertex) = z_kurt;
388 dec_z_skew(*vertex) = z_skew;
390 if (acc_deltaZ.
isAvailable() && photonsIn->size() > 0 ) {
392 if (!std::isfinite(acc_deltaZ(*vertex))) {
394 dec_photon_deltaz(*vertex) = -1;
397 dec_photon_deltaz(*vertex) = acc_deltaZ(*vertex);
401 dec_photon_deltaz(*vertex) = -1;
403 if (acc_deltaPhi.
isAvailable() && photonsIn->size() > 0) {
405 if (!std::isfinite(acc_deltaPhi(*vertex))) {
407 dec_photon_deltaPhi(*vertex) = -1;
410 dec_photon_deltaPhi(*vertex) = acc_deltaPhi(*vertex);
414 dec_photon_deltaPhi(*vertex) = -1;
418 std::vector<ElementLink<xAOD::ElectronContainer>> electronLinks;
421 if(!id_trk)
continue;
423 if(!eleVertex)
continue;
425 if(*eleVertex == vertex){
428 electronLinks.push_back(elLink);
431 dec_electronLinks(*vertex) = electronLinks;
433 std::vector<ElementLink<xAOD::PhotonContainer>> photonLinks;
438 photonLinks.push_back(phLink);
440 dec_photonLinks(*vertex) = photonLinks;
443 std::vector<ElementLink<xAOD::CompositeParticleContainer>> mpLinks;
444 if (haveMP && vertex == bestVtxForMP)
446 mpLinks.push_back(mpLink);
448 dec_multiPhotonLinks(*vertex) = mpLinks;
451 dec_jetLinks(*vertex) = jetsInVertex[vertex];
453 std::vector<ElementLink<xAOD::MuonContainer>> muonLinks;
455 const auto *tp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
459 if(!muonVertex)
continue;
461 if(*muonVertex == vertex){
464 muonLinks.push_back(muonLink);
467 ATH_MSG_DEBUG(
"Skipping muon as the track is not associated to any PV ");
468 ATH_MSG_DEBUG(
"Muon pT, eta = " << muon->pt() <<
" " << muon->eta());
472 dec_muonLinks(*vertex) = muonLinks;
478 return StatusCode::SUCCESS;
float vz() const
The z origin for the parameters.